だから私はスクリプトを作成し、最後に飲み物を入力したときに実行しない行が実行されることを除いてうまくいきました。最後の行は、「いいえ」または「いいえ」を入力した場合にのみ表示されます。私が何を間違っているのでしょうか?
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" ];
これは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
それをより大きな複合文に結合する必要があります。elif
if-elif-fi
上記の修正は次のとおりです。
echo -n "のどが渇いていますか?" 読む if ["$th" = "はい"] || ["$th" = "はい"]; エコ:「何を飲みますか?」 読む if ["$th" = "水"]; エコ「シャープで爽やか」。 elif ["$th" = "ビール"]; echo「身分証明書を見せてください」 elif [ "$th" = "ワイン" ]; echo「1箱ですか、それとも2箱ですか?」 その他 echo「すぐにリリースされます。」 フィリピン諸島 elif ["$th" = "いいえ"] || ["$th" = "いいえ"]; echo「のどが渇いたらまた来てください」 フィリピン諸島