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