带有多个条件的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'

我的括号是不是乱了?

761570 次浏览

使用-a(用于和)和-o(用于或)操作。

< a href = " http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_07_01.html " > 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操作符,因为它是不可移植的。

你可以从MySQL的贡献者写的entrypoint.sh 脚本中得到一些启发,它检查指定的变量是否被设置了。

如脚本所示,你可以用-a来管道它们,例如:

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
...
fi

请尝试以下操作

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