2つの選択肢を読み取るスクリプトを作成しようとしていますが、両方が「y」になる場合は、「Test Done!」と言います。そして、それらの一方または両方が「y」にならない場合、「Test Failed!」と言いたいここに私が思いついたものがあります:
echo "- Do You want to make a choice ?"
read choice
echo "- Do You want to make a choice1 ?"
read choice1
if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
しかし、両方の質問に「y」で答えると、「テストに失敗しました!」 「Test Done!」の代わりに。そして、両方の質問に「n」で答えると、「Test Done!」と言っています。私が間違ったことは何ですか?
間違った状態をチェックしています。
if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ];
上記のステートメントは、choice!='y'
およびchoice1!='y'
、そしてプログラムは正しく印刷します"Test Done!"。
修正されたスクリプトは
echo "- Do You want to make a choice ?"
read choice
echo "- Do You want to make a choice1 ?"
read choice1
if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
プログラムは、指示どおりに実行しています。 「最初の選択肢が「y」に等しくなく、2番目の選択肢が「y」に等しくない場合は「テスト完了!」を印刷し、そうでない場合は「テスト失敗!」を印刷します-両方の選択肢が---である場合のみnot yは「Test Done!」と出力されます。
あなたはおそらく意味:
echo "- Do You want to make a choice ?"
read choice
echo "- Do You want to make a choice1 ?"
read choice1
if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
私が変更され !=
等しくない==
等しい。両方の質問に「y」と答えた場合にのみ、「Test Done!」印刷される.
if [ "$choice" != 'y' -a "$choice1" != 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
比較ロジックが逆になりました。あなたが言いたかったあなたの説明から
if [ "$choice" = 'y' ] && [ "$choice1" = 'y' ]; then
実際には、&&コンストラクトが機能することに驚いていますが、さらに詳しく調べるとおそらく機能するはずです。それでも、私はそれを
if [ "$choice" = 'y' -a "$choice1" = 'y' ]; then
ロジックが逆になっています。 ==をチェックする必要があるときに!=をチェックしています。これを試して:
if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
別の考え、
$ c1='y' ; c2='y' ; [[ ${c1} = 'y' ]] && [[ ${c2} = 'y' ]] && echo true || echo false
true
$ c1='n' ; c2='y' ; [[ ${c1} = 'y' ]] && [[ ${c2} = 'y' ]] && echo true || echo false
false
$ c1='n' ; c2='y' ; [[ ${c1} = 'y' ]] || [[ ${c2} = 'y' ]] && echo true || echo false
true
$ c1='n' ; c2='n' ; [[ ${c1} = 'y' ]] || [[ ${c2} = 'y' ]] && echo true || echo false
false
$
意味不明のオーバーフロー。 (;
試した場合
if [[ "$choice" != 'y' && "$choice1" != 'y' ]]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
この行
if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ]; then
両方の選択肢が「y」であるかどうかをテストします。したがって、両方の選択肢が「y」の場合、ステートメントは偽であり、プログラムは「Test Failed」を正しく出力します