シェルスクリプト:if [閉じる]で複数または演算子の条件が等しくない

シェルスクリプト:if [閉じる]で複数または演算子の条件が等しくない

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と評価されます)。ynまたはiftrue)、これはtrueで、内部コマンドを実行します。

ifif 、$valueそれyはいはと同じですが、とはy等しくないので、n次のように評価されます。 (falseまたはそうです)、ここでそれは真実です。、内部コマンドがif再実行されます。

if内部コマンドが実行されない唯一のケースは、両方のテストがfalseの場合です。つまり、同じと同じが$valueすべて必要です。yn

基本的にあなたが欲しいのはこれです

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" ]]などを使用してください。)[[

また見なさい:

おすすめ記事