Оператор 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
(или) операции.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