複数の条件を含むステートメントのbashがエラーをスローする


165

2つのエラーフラグをチェックするスクリプトを作成しようとしています。1つのフラグ(または両方)が変更された場合、エコーされます-エラーが発生しました。私のスクリプト:

my_error_flag=0
my_error_flag_o=0
do something.....
if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" &&     "$my_error_flag_o"="2" ]]; then
    echo "$my_error_flag"
else
    echo "no flag"
fi

基本的には、次のようになります。

if ((a=1 or b=2) or (a=1 and b=2))
  then
     display error
else
     no error
fi

私が得るエラーは:

 line 26: conditional binary operator expected
 line 26: syntax error near `]'
 line 26: `if [[ "$my_error_flag"=="1" || "$my_error_flag_o"=="2" ] || [ "$my_error_flag"="1" && "$my_error_flag_o"="2" ]]; then'

ブラケットがめちゃくちゃになっていますか?


このアウトをチェックしてください:theunixshell.blogspot.com/2013/05/...
ビジェイ

2
かっこを使用-()
AlikElzin-kilaka


3
論理的には、a==1 or b==2すでにa==1 and b==2。これを個別にテストすることは、ここでは完全に不要です。
tripleee 2016

回答:


248

使用-a(および)と-o操作(または)。

tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html

更新

実はあなたはまだ使用できる&&||して-eq運転。したがって、スクリプトは次のようになります。

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ] || ([ $my_error_flag -eq 1 ] && [ $my_error_flag_o -eq 2 ]); then
      echo "$my_error_flag"
else
    echo "no flag"
fi

あなたの場合では、最後の2つの式を破棄して、次のような1つまたは操作を続けることができます:

my_error_flag=1
my_error_flag_o=1
if [ $my_error_flag -eq 1 ] ||  [ $my_error_flag_o -eq 2 ]; then
      echo "$my_error_flag"
else
    echo "no flag"
fi

3
@Simply_Me:いいえ。一方または両方のオペランドが真の場合、論理ORは真です。あなたは「排他的論理和」(XOR)を考えています。これは、そのオペランドの1つが真である場合に真です。(実際には、2つ以上のオペランドで機能するXORのバージョンがあります。その場合、奇数のオペランドがtrueであればtrueになります。)
Gordon Davisson 2013

4
ちなみに、元のコードの問題には、グループ化の使用[]グループ化(それらは行いません)、および演算子の周りにスペースを配置できない(例"$my_error_flag"="1":)ため、シェルがそれを演算子としてまったく認識できません。BashFAQ#17(グループ化について)および#31(異なるタイプのテスト式の違いについてをお読みください。実際には、この場合、算術式を使用する方が簡単です。
Gordon Davisson 2013

7
-aそして、-oによって廃止されたと考えられているPOSIX仕様||アップデートと同様に、個別のテストを組み合わせて使用​​します。
chepner 2013

1
サブシェルを使用してグループ化する{}必要はなく、通常はを使用してグループ化することも可能です。
phk

1
上記のphkのコメントに追加すると、()はbashでサブシェルを起動します。これは、あらゆる種類の微妙な[おそらく望ましくない]効果を持つ可能性があります。
brett

70

[[または((キーワードを使用できます。あなたが使用する場合は[[、キーワードを、次のような文字列演算子を使用する必要があり-eq-lt。私が思うに、((あなたは直接のような演算子を使用することができますので、ほとんど、算術演算のために好ましい==<>

[[演算子を使用する

a=$1
b=$2
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

((演算子を使用する

a=$1
b=$2
if (( a == 1 || b == 2 )) || (( a == 3 && b == 4 ))
then
     echo "Error"
else
     echo "No Error"
fi

それはポータブルではないので、-aまたは-o演算子を使用しないでください。


8

以下をお試しください

if ([ $dateR -ge 234 ] && [ $dateR -lt 238 ]) || ([ $dateR -ge 834 ] && [ $dateR -lt 838 ]) || ([ $dateR -ge 1434 ] && [ $dateR -lt 1438 ]) || ([ $dateR -ge 2034 ] && [ $dateR -lt 2038 ]) ;
then
    echo "WORKING"
else
    echo "Out of range!"

2
( ... )サブシェルを作成します-パフォーマンスに多大な影響を与え、メリットはありません。
Charles Duffy

4
{ ...; }サブシェルを作成せずにグループ化するために使用します。
Charles Duffy

1

MySQLのコントリビューターによって書かれた、指定された変数が設定されているかどうかをチェックするentrypoint.sh スクリプトを読むことで、インスピレーションを得ることができます。

スクリプトが示すように、それらを-aでパイプすることができます。例:

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi

1
-a現在のバージョンのPOSIX test標準では廃止予定としてマークされています。pubs.opengroup.org/onlinepubs/9699919799/utilities/test.htmlでOBマーカーを確認してください。より信頼性の高いコードを作成するために使用します。[ -z "$FOO" ] && [ -z "$BAR" ]
Charles Duffy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.