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
か等しい場合は機能しません1
。01
または一緒に動作します0001
。