cattest.sh
read value
if [ $value != "y" ] || [ $value != "n" ]
then
echo "invalid"
exit 1
fi
実行時に「n」、「m」、「y」などの値を渡してみました。 「m」を渡すと、スクリプトが終了したいと思います。しかし、期待どおりに動作しません。
注:上記のコードはBashシェル用です。
私は成功せずにいくつかの構文を試しました。
if [ $value != "y" || $value != "n" ]
if [[ $value != "y" ] || [ $value != "n" ]]
if [[ $value != "y" ]] || [[ $value != "n" ]]
if [[ $value != "y" || $value != "n" ]]
条件が満たされない場合もあります
この問題を解決するのに役立ちます
答え1
「m」を渡すと、スクリプトが終了したいと思います。しかし、期待どおりに動作しません。
いいですね。条件は次のとおりです。
if [ $value != "y" ] || [ $value != "n" ]; then
echo "invalid"
...
この場合は、等しく$value
ないし、等しくm
ないので(trueと評価されます)。y
n
またはif
true)、これはtrueで、内部コマンドを実行します。
ifif 、$value
それy
はいはと同じですが、とはy
等しくないので、n
次のように評価されます。 (falseまたはそうです)、ここでそれは真実です。、内部コマンドがif
再実行されます。
if
内部コマンドが実行されない唯一のケースは、両方のテストがfalseの場合です。つまり、同じと同じが$value
すべて必要です。y
n
基本的にあなたが欲しいのはこれです
if [ $value = "y" ] || [ $value = "n" ]; then
echo ok
else
echo invalid
fi
しかし、役に立たない「ok」分岐がないため、条件が逆になります。
if ! ( [ $value = "y" ] || [ $value = "n" ] ); then
echo invalid
fi
今(AまたはB)は(いいえㅏまたは私)、しかし(いいえㅏそして いいえB)それはまさにあなたの出来事で言うべきことです。
また、変数拡張を引用したいと思います。そうしないと、内容の空白によって$value
コマンドが解釈される方法がめちゃくちゃになるからです。
if [ "$value" != "y" ] && [ "$value" != "n" ]; then
echo invalid
fi
(または特殊で空白のため分割が発生しない数少ない場合のいずれかですので[[ $value != "y" ]]
などを使用してください。)[[
また見なさい: