我正在尝试编写一个将检查两个错误标志的脚本,如果一个标志(或两者)都被更改,它将会回显 - 发生错误。我的剧本:
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'
我的括号搞砸了吗?
答案 0 :(得分:201)
使用-a
(for和)和-o
(for或)操作。
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
答案 1 :(得分:51)
您可以使用[[
或((
关键字。使用[[
关键字时,必须使用-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
运算符,因为它不是便携式的。
答案 2 :(得分:7)
请尝试以下
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!"
答案 3 :(得分:1)
您可以通过阅读MySQL的贡献者编写的entrypoint.sh
script来获取灵感,该-a
Angular2 method binding error: "value has changed after it was checked"检查指定的变量是否已设置。
如脚本所示,您可以使用if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
...
fi
来管道它们,例如:
....Call enableProdMode() to enable the production mode.