Оператор 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 119

4 ответа:

использовать -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

хотя в вашем случае вы можете отказаться от последних двух выражений и просто придерживаться одной или такой операции:

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=
b=
if [[ a -eq 1 || b -eq 2 ]] || [[ a -eq 3 && b -eq 4 ]]
then
     echo "Error"
else
     echo "No Error"
fi

используя (( оператор

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

не используйте -a или -o операторов, так как это не портативный.

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

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