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

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

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'

Мои кронштейны испорчены?

4 ответа

Решение

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

http://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

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

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

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

Пожалуйста, попробуйте следующее

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

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

Как показывает сценарий, вы можете передать их -aНапример:

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi
Другие вопросы по тегам