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이는 사용자가 또는 로 시작하는 문자열을 입력하여 중단하는 무한 루프를 구현하지만 Y기본값은 입력을 "아니요"로 해석합니다.

Y, yYes를 확인해야 하는 경우 yes(예: "no"와 같은 문자열을 처리하려면 yup) 다음을 사용하세요.

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

관련 정보