web-dev-qa-db-ja.com

複数の条件を持つif文がエラーをスローする

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'

私の括弧はめちゃくちゃになっていますか?

132
Simply_me

-a(forおよび)および-o(forまたは)操作を使用してください。

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
199
mkhatib

[[または((のどちらかのキーワードを使用できます。 [[キーワードを使用するときは、-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演算子は移植性がないので使用しないでください。

51
Fizer Khan

フォローしてみてください

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!"
7
Manash Nath

指定された変数が設定されているかどうかをチェックするMySQLの貢献者によって書かれたentrypoint.shscript を読むことで、何かインスピレーションを得ることができます。

スクリプトが示すように、あなたはそれらを-aでパイプ処理することができます。

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