쉘 스크립팅 - 하나의 if 문에서 여러 동등성 테스트

쉘 스크립팅 - 하나의 if 문에서 여러 동등성 테스트

그래서 스크립트를 만들었고 마지막에 음료를 입력할 때 실행해서는 안되는 줄이 실행되는 것을 제외하고는 잘 작동했습니다. 마지막 줄은 "아니요" 또는 "아니요"를 입력할 때만 나타납니다. 제가 뭘 잘못하고 있는 걸까요?

echo -n "Are you thirsty?"
read th

if [ "$th" = "yes" ] || [ "Yes" ]; then
    echo "What would you like to drink?"
    read th
fi

if [ "$th" = "water" ]; then
    echo "Clear crisp and refreshing."
elif [ "$th" = "beer" ]; then
    echo "Let me see some ID."
elif [ "$th" = "wine" ]; then
    echo "One box or Two?"
else
    echo "Coming right up."
fi

if [ "$th" = "no" ] || [ "No" ]; then
    echo "Come back when you are thirsty."
fi

답변1

귀하의 질문은 [ "Yes" ]저것 [ "No" ]과 동일하며 [ -n "Yes" ]따라서 [ -n "No" ]항상 true로 평가됩니다.

올바른 구문은 다음과 같습니다.

if [ "$th" = "yes" ] || [ "$th" = "Yes" ]; then
...
if [ "$th" = "no" ] || [ "$th" = "No" ]; then

또는:

if [ "$th" = "yes" -o "$th" = "Yes" ]; then
...
if [ "$th" = "no" -o "$th" = "No" ]; then

또는 bashBourne 쉘 인터프리터를 사용하는 경우:

if [ "${th,,}" = "yes" ]; then
...
if [ "${th,,}" = "no" ]; then

( ${th,,}변수의 소문자 값으로 대체 th)

답변2

귀하의 테스트는 귀하가 생각하는 대로 수행되지 않습니다.

if [ "$var" = "value" ] || [ "Value" ];

이것은 두 가지 동일성 테스트를 수행하지 않습니다. 첫 번째 사례를 확인한 다음 실패하면 "Value"존재하는지 확인합니다. 확인해야 하는 경우이기 때문입니다. 따라서 항상 then해당 항목 으로 전달됩니다 if. 다음을 수행할 수 있습니다.

if [ "$var" = value" ] || [ "$var" = "Value" ]

더 나은 접근 방식은 블록을 보는 것입니다 case..esac.

case "$var" in
    value|Value)
        do_stuff
        ;;
    other|Other)
        do_something_else
        ;;
esac

답변3

[ "Yes" ](1) 이후의 합계를 테스트할 때에도 두 부분과 [ "No" ]비교 th해야 합니다.

[ "$th" = "yes" ] || [ "$th" = "Yes" ]

그리고

[ "$th" = "no" ] || [ "$th" = "No" ]

(2) 섹션의 경우 if [ "$th" = "yes" ] || [ "$th" = "Yes" ];이 코드 블록을 확장하여 테스트까지 모든 것을 포함해야 하며, 그 시점에서 No이를 더 큰 복합 명령문으로 결합해야 합니다.elifif-elif-fi

위에서 언급한 수정 사항은 다음과 같습니다.

echo -n "목마르세요?"
읽다

if [ "$th" = "예" ] || ["$th" = "예" ];

    에코: "뭐 마실래?"
    읽다

    if ["$th" = "물"];
      에코 "선명하고 상쾌한".
    elif [ "$th" = "맥주" ];
      echo "신분증 좀 보여주세요."
    elif [ "$th" = "와인" ];
      echo "한 상자인가요, 아니면 두 상자인가요?"
    기타
      echo "곧 출시됩니다."
    필리핀 제도

elif [ "$th" = "아니요" ] || ["$th" = "아니요"];
    echo "목마르면 다시 오세요."
필리핀 제도

관련 정보