그래서 스크립트를 만들었고 마지막에 음료를 입력할 때 실행해서는 안되는 줄이 실행되는 것을 제외하고는 잘 작동했습니다. 마지막 줄은 "아니요" 또는 "아니요"를 입력할 때만 나타납니다. 제가 뭘 잘못하고 있는 걸까요?
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
또는 bash
Bourne 쉘 인터프리터를 사용하는 경우:
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
이를 더 큰 복합 명령문으로 결합해야 합니다.elif
if-elif-fi
위에서 언급한 수정 사항은 다음과 같습니다.
echo -n "목마르세요?" 읽다 if [ "$th" = "예" ] || ["$th" = "예" ]; 에코: "뭐 마실래?" 읽다 if ["$th" = "물"]; 에코 "선명하고 상쾌한". elif [ "$th" = "맥주" ]; echo "신분증 좀 보여주세요." elif [ "$th" = "와인" ]; echo "한 상자인가요, 아니면 두 상자인가요?" 기타 echo "곧 출시됩니다." 필리핀 제도 elif [ "$th" = "아니요" ] || ["$th" = "아니요"]; echo "목마르면 다시 오세요." 필리핀 제도