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