Bash Если оператор с несколькими условиями выдает ошибку

Я пытаюсь написать script, который будет проверять два флажка ошибки, и в случае изменения одного флага (или обоих) он будет эхом - произошла ошибка. Мой script:

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'

Мои скобки испорчены?

Ответы

Ответ 1

Используйте -a (для и) и -o (для или) операции.

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

Update

На самом деле вы все равно можете использовать && и || с помощью операции -eq. Таким образом, ваш script будет выглядеть следующим образом:

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

Хотя в вашем случае вы можете отменить последние два выражения и просто придерживаться одного или действовать следующим образом:

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

Ответ 2

Вы можете использовать ключевое слово [[ или ((. Когда вы используете ключевое слово [[, вам нужно использовать строковые операторы, такие как -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, так как это не Portable.

Ответ 3

Пожалуйста, попробуйте следовать

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

Ответ 4

Вы можете получить вдохновение, прочитав entrypoint.sh script, написанный вкладчиками из MySQL, который проверяет, были ли заданы указанные переменные.

Как показывает script, вы можете передать их с помощью -a, например:

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