bash test似乎不支持带有多个参数的逻辑测试:
[ expr1 -o expr2 -o expr3 -o expr4 ]nor
[[ expr1 || expr3 || expr3 || expr4 ]]'-a‘和'&&’也是如此。如何在没有太多嵌套大括号的情况下以整齐的方式编写这样的条件(特别是.当有更多的部件处于状态时)?
发布于 2017-10-06 20:40:31
似乎bash test不支持带有多个参数的逻辑测试
它确实是:
$ [ 0 -le 1 -a 1 -le 2 ] && echo yes
yes
$ [[ 0 -le 1 && 1 -le 2 ]] && echo yes
yes
$ [ 0 -ge 1 -o 1 -ge 2 ] || echo no
no
$ [[ 0 -ge 1 || 1 -ge 2 ]] || echo no
no但test手册页上写道:
注意:二进制-a和-o本质上是不明确的。改为使用'test EXPR1 && test EXPR2‘或'test EXPR1 || test EXPR2’。
如果您的问题更多地是关于运算符的优先级,请注意&&和|| bash列表运算符具有相同的优先级和左结合性。因此,有时需要对子表达式进行分组:
{ [[ expr1 ]] && [[ expr2 ]]; } || { [[ expr3 ]] || [[ expr4 ]]; }但它很简单,很容易理解。
发布于 2017-10-06 20:41:34
下面的示例适用于我在Bash 4中的工作,例如
$ [ 1 = 1 -a 2 = 2 -a 3 = 3 -a 4 = 4 ] && echo True || echo False
True
$ [ 1 = 1 -a 2 = 2 -a 3 = 3 -a 4 = 0 ] && echo True || echo False
False
$ [ 1 = 1 -o 2 = 2 -o 3 = 3 -o 4 = 4 ] && echo True || echo False
True
$ [ 1 = 1 -o 2 = 0 -o 3 = 0 -o 4 = 0 ] && echo True || echo False
True
$ [ 1 = 0 -o 2 = 0 -o 3 = 0 -o 4 = 0 ] && echo True || echo False
False根据man [ (或man test):
对于两端,始终使用-a和-o进行评估。
要避免这种情况,请编写:[ -z abc ] && [ -w file ].
https://stackoverflow.com/questions/46605743
复制相似问题