Bash: while 루프에는 출력이 없습니다. 더 나은 솔루션이 있습니까?

Bash: while 루프에는 출력이 없습니다. 더 나은 솔루션이 있습니까?

나는 bash 스크립팅을 처음 접했고 스크립트의 다음 부분에서는 어떤 출력도 제공하지 않습니다.

check=""
while [ "$check"=="" ]
do
    read -p "Signature Correct?(Yes/No): " check

if [ "$check" != "Y" || "$check" != "y" || "$check" != "Yes" || "$check" != "yes" || "$check" != "N" || "$check" != "n" || "$check" != "No" || "$check" != "no" ];
then
    check=""
elif ["$check" == "Y" || "$check" == "y" || "$check" == "Yes" || "$check" == "yes" ];
then
    echo "Signature Accepted!"
elif [ "$check" != "N" || "$check" != "n" || "$check" != "No" || "$check" != "no" ];
then
    check=""
fi
done

오류 메시지가 표시되지 않습니다. 도움이 필요하세요? 더 영리하거나 더 짧은 솔루션이 있다면 해당 지식의 혜택을 누리게 되어 기쁩니다.

감사합니다!

답변1

제안:

#!/bin/bash

while true; do
    read -p 'Is signature correct? y/[n]: '

    [[ $REPLY == [Yy]* ]] && break

    echo 'Ok, asking again...'
done

echo 'Signature accepted'

y이는 사용자가 or로 시작하는 문자열을 입력하여 중단하는 무한 루프를 구현 Y하지만 입력은 기본적으로 "no"로 해석됩니다.

Y, yYesyes(즉, 문자열을 yup"no"로 처리) 확인해야 하는 경우 다음을 사용하십시오.

case $REPLY in ([Yy]|[Yy]es) break; esac

테스트하는 대신 [[ ... ]]break.

답변2

여기에는 두 가지 다른 방법이 있습니다. 첫 번째는 정규식을 사용하여 예/아니요를 일치시키고, 다른 하나는 select내장된 표현식을 사용합니다.

#!/bin/bash

echo "Version 1"

check=
while [[ -z $check ]]; do
    read -r -p "Signature Correct? (Yes/No): " check
    if [[ $check =~ ^[Nn]o?$ ]]; then
        echo "Try again"
        check=
    elif [[ $check =~ ^[Yy](es)?$ ]]; then
        echo "Signature accepted"
        break;
    else
        echo "Invalid input."
        check=
    fi
done

echo "Version 2"

PS3="Signature Correct? (1 for Yes/ 2 for No): "
select opt in Yes No; do
    case $opt in
        Yes)
            echo "Signature accepted"
            break;;
        No)
            echo "Try again.";;
        *)
            echo "Invalid input."
    esac;
done

관련 정보