BASH: $1 位置の OR 演算子

BASH: $1 位置の OR 演算子

OR演算子が$ 1で機能しないという問題があります。たとえば、

if [[ "$1" != '1' || '2' ]]
        then
               echo "BAD"
        else
               echo "OK"
        fi

このテストを実行すると、$1が何であれ常にBADが発生します。

1ドルを1または2でどのように結び付けることができますか?

答え1

標準sh構文の使用(したがって、bash他のすべてのPOSIX互換シェルで認識されます):

case $1 in
  (1 | 2) echo OK;;
  (*) echo BAD;;
esac

または:

if [ "$1" = 1 ] || [ "$1" = 2 ]; then
  echo OK
else
  echo BAD
fi

(これは文字列のバイト間比較です1

コンストラクタ=(コピー)の/演算子は、実際には等価演算子ではなく、パターン一致演算子です。したがって、この特別な場合に単一の文字を一致させたい場合は、その項目で使用されている標準構文のようにこれを行うこともできます。方法。!=bash[[...]]ksh[[ $1 != [12] ]]case $1 in ([12])sh

答え2

BAD常にステートメントに分岐する理由ifは、テストが

[[ "$1" != '1' || '2' ]]

まず$1、そうでないことをテストし、1そうでない場合はBAD印刷します。もしそうなら、2テストとして評価されます。このような文字列は2常に真でBAD印刷されます。

代わりに:

if [ "$1" != '1' ] && [ "$1" != '2' ]; then

または算術テストを通して

if [ "$1" -ne 1 ] && [ "$1" -ne 2 ]; then

または算術評価を使用して

if (( $1 != 1 )) && (( $1 != 2 )); then

答え3

if [[ "$1" != '1' || "$1" != '2' ]]
then
               echo "BAD"
else
               echo "OK"
fi

その後、2と1が等しくない場合は、!=ステートメントを繰り返す必要があります。

答え4

ロジックに($1 != 1) OR ($1 != 2)欠陥があります。

もし$1そう1ならいいえ等しい2ので、テストは真です。
さらに、そうであれば$1そうです2いいえ同じ1で、テストも維持されます。つまり、テストは常に正しいです。

($1 == 1) or ($1 == 2)次のように同等性をテストする必要があります。

if [[ ($1 == '1') || ($1 == '2') ]]; then
    echo "$1 OK"
else
    echo "$1 BAD"
fi

またはもっと簡単です(ksh、bash、またはzsh)。

[[ $1 == [12] ]] && echo "$1 OK" || echo "$1 BAD"

またはsh構文を使用してください(すべてのPOSIXシェルに移植可能)。

if [ "$1" = '1' ] || [ "$1" = '2' ]; then
            echo "$1 OK"
else
            echo "$1 BAD"
fi

またはケースイディオムを使用して:

case $1 in
    (1 | 2) echo "$1 OK"  ;;
    (*) echo BAD "$1 BAD" ;;
esac

上記はすべて文字列比較です。数値比較をしたい場合は、次のことができます。

if [ "$1" -eq 1 ] || [ "$1" -eq 2 ]; then
            echo "$1 OK"
else
            echo "$1 BAD"
fi

$1ただし、この方法は、他の数値が1.0等しい1e0か等しい場合は機能しません101または一緒に動作します0001

関連情報