29

2 つの選択肢を読み取るスクリプトを作成しようとしています。どちらも「y」の場合は、「テスト完了!」と表示させたいと考えています。そして、それらのいずれかまたは両方が「y」でない場合は、「テストに失敗しました!」と表示させたいと思います。

これが私が思いついたものです:

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」で答えると、「テストに失敗しました!」と表示されます。「テスト完了!」の代わりに。両方の質問に「n」で答えると、「Test Done!」と表示されます。

私は何を間違えましたか?

4

8 に答える 8

48

間違った条件をチェックしています。

if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ];

上記のステートメントは と の場合に真choice!='y'であるため、プログラムは"Test Done!"choice1!='y'を正しく出力します。.

修正したスクリプトは

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
于 2012-07-06T22:03:36.323 に答える
3

プログラムは、あなたが指示したとおりに実行しています。「最初の選択肢が「y」に等しくなく、2番目の選択肢が「y」に等しくない場合は「テスト完了!」と印刷します。それ以外の場合は「テスト失敗!」と印刷します。つまり、両方の選択肢がyでない場合にのみ「TestDone!」が印刷されます。

あなたはおそらく意味しました:

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」と答えた場合にのみ、「テスト完了!」になります。印刷されます。

于 2012-07-06T22:07:26.667 に答える
1

比較ロジックが逆になっています。あなたが言いたかったあなたの説明から

if [ "$choice" = 'y' ] && [ "$choice1" = 'y' ]; then

&& コンストラクトが機能することに実際に驚いていますが、さらに調べてみると、おそらく機能するはずです。それでも、私はそれを次のように書きます

if [ "$choice" = 'y' -a "$choice1" = 'y' ]; then
于 2012-07-06T22:05:43.843 に答える
1

論理が逆になっています。== をチェックする必要があるときに != をチェックしています。これを試して:

if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
于 2012-07-06T22:06:28.527 に答える
1

もう一つの考えは、

$ 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  
$  

意味不明のオーバーフロー。(;

于 2015-12-02T07:14:36.830 に答える
1

試す:

if [[ "$choice" != 'y' && "$choice1" != 'y' ]]; then
    echo "Test Done!"
else
    echo "Test Failed!"
fi
于 2012-07-06T22:03:01.680 に答える
1
if [ "$choice" != 'y' -a "$choice1" != 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
于 2012-07-06T22:04:04.933 に答える
0

この線

if [ "$choice" != 'y' ] && [ "$choice1" != 'y' ]; then

両方の選択肢が 'y' でないかどうかをテストします。したがって、両方の選択肢'y' の場合、ステートメントは false であり、プログラムは "Test Failed" を正しく出力します。

于 2012-07-06T22:04:59.223 に答える