测试操作员-a和-o短路?

时间:2015-09-25 21:18:55

标签: shell posix sh

test运营商-a-o短路了吗?

我试过if [ 0 -eq 1 -a "" -eq 0 ]; then ...抱怨第二个条件的语法。但我不知道这是不是因为

  1. -a不会短路
  2. test希望在开始之前对所有内容进行适当格式化,但仍然会短路。
  3. 结果导致我创建一个嵌套的if,当我真正想要的是第一个条件将防止执行第二个时,如果还没有设置特定的var ...

    编辑:至于我为什么使用过时的操作符,代码必须在我的环境中无处不在,我只是找到了一台机器

    while [ -L "$file" ] && [ "$n" -lt 10 ] && [ "$m" -eq 0 ]; do

    是一个无限循环,并且更改为过时的-a会产生良好的行为:

    while [ -L "$file" -a "$n" -lt 10 -a "$m" -eq 0 ]; do

    我该怎么办?第一个表达式适用于许多机器但不是这台机器似乎需要第二个表达式......

2 个答案:

答案 0 :(得分:5)

the POSIX specification for test

  

> 4个参数:   结果未明确。

因此,除了XSI扩展,POSIX没有说明这种行为。

此外,即使在系统 XSI扩展名

上也是如此
  

expression1 -a expression2:如果expression1和expression2都为真,则为真;否则,错误。 -a二进制主要是左关联的。它的优先级高于-o。 [选项结束]

     

expression1 -o expression2:如果expression1或expression2为true,则为真;否则,错误。 -o二进制主要是左关联的。 [选项结束]

没有关于短路的规范。

如果您想要短路行为 - 或者根本就是POSIX定义的行为 - 请使用&&||来连接多个单独的测试调用。

从文档后面再次引用:

  

申请使用

     

XSI扩展指定-a和-o二元原色和'('和')'运营商已被标记为过时。 (使用它们的许多表达式由语法模糊地定义,具体取决于要评估的特定表达式。)使用这些表达式的脚本应转换为下面给出的表单。尽管许多实现将继续支持这些过时的表单,但在处理用户提供的输入时,脚本应该非常小心,这些输入可能与这些以及其他原色和运算符混淆。除非应用程序开发人员知道产生脚本输入的所有情况,否则调用如:

test "$1" -a "$2"
     

应写成:

test "$1" && test "$2"

答案 1 :(得分:1)

嗯,你已经知道了这个行为,所以这个问题实际上就是如何解释这些结果。但是TBH,没有太多真正的单词场景,你会观察到不同的行为。

我创建了一个小测试用例来检查发生了什么(至少在我的系统上,因为另一个答案表明它没有标准化):

strace bash -c "if [ 0 -eq 1 -a -e "/nosuchfile" ]; then echo X; fi"

如果检查输出,你会看到bash查找文件,所以答案是:

操作员不要短路。