186

我正在尝试编写一个脚本来检查两个错误标志,如果一个标志(或两个)被更改,它会回显——发生错误。我的脚本:

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

4 回答 4

288

使用-a(for and) 和-o(for or) 操作。

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
于 2013-04-24T22:12:40.520 回答
83

您可以使用其中一个[[((关键字。使用[[关键字时,必须使用字符串运算符,例如-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

不要使用-aor-o运算符,因为它不是便携式的。

于 2013-11-28T10:08:11.713 回答
8

请尝试以下

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!"
于 2016-09-11T06:06:59.780 回答
1

entrypoint.sh 您可以通过阅读由 MySQL 的贡献者编写的脚本来获得一些灵感,该脚本检查是否设置了指定的变量。

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

if [ -z "$MYSQL_ROOT_PASSWORD" -a -z "$MYSQL_ALLOW_EMPTY_PASSWORD" -a -z "$MYSQL_RANDOM_ROOT_PASSWORD" ]; then
    ...
fi
于 2016-03-01T11:04:38.720 回答