シェルスクリプト - 1つのif文で複数の同等性をテストする

シェルスクリプト - 1つの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" ];

これは2つの同一性テストを実行しません。最初のケースを確認し、失敗した場合に存在することを"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)以降の合計をテストするときも、2つの部分と[ "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「1箱ですか、それとも2箱ですか?」
    その他
      echo「すぐにリリースされます。」
    フィリピン諸島

elif ["$th" = "いいえ"] || ["$th" = "いいえ"];
    echo「のどが渇いたらまた来てください」
フィリピン諸島

関連情報