web-dev-qa-db-ja.com

ifの2つの条件

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!」と言っています。私が間違ったことは何ですか?

21
Andrzej Florek

間違った状態をチェックしています。

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
37
abhshkdz

プログラムは、指示どおりに実行しています。 「最初の選択肢が「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!」印刷される.

3
idz
if [ "$choice" != 'y' -a "$choice1" != 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
1
PasteBT

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

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

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

if [ "$choice" = 'y' -a "$choice1" = 'y' ]; then
1

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

if [ "$choice" == 'y' ] && [ "$choice1" == 'y' ]; then
    echo "Test Done !"
else
    echo "Test Failed !"
fi
1
jlehr

別の考え、

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

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

1
anonimous

試した場合

if [[ "$choice" != 'y' && "$choice1" != 'y' ]]; then
echo "Test Done !"
else
echo "Test Failed !"
fi
0
Skippy Fastol

この行

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

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

0
cdk