Shell 是否测试操作员-a和-o短路?
是否测试操作员Shell 是否测试操作员-a和-o短路?,shell,posix,sh,Shell,Posix,Sh,是否测试操作员-a和-o短路 我尝试了if[0-eq 1-a”“-eq 0];然后…抱怨第二个条件的语法。但我不知道这是不是因为 -a不会短路 或者test希望所有内容在开始之前都正确格式化,但仍然存在短路 结果导致我创建了一个嵌套的if,而我真正想要的是,如果还没有设置特定的var,第一个条件将防止执行第二个条件 编辑:至于我为什么要使用过时的操作符,代码必须在我的环境中的任何地方都能工作,我刚刚发现一台机器 while[-L“$file”]&&&&&[“$n”-lt 10]&&&[“$m”-
-a
和-o
短路
我尝试了if[0-eq 1-a”“-eq 0];然后…
抱怨第二个条件的语法。但我不知道这是不是因为
-a
不会短路test
希望所有内容在开始之前都正确格式化,但仍然存在短路if
,而我真正想要的是,如果还没有设置特定的var,第一个条件将防止执行第二个条件
编辑:至于我为什么要使用过时的操作符,代码必须在我的环境中的任何地方都能工作,我刚刚发现一台机器
while[-L“$file”]&&&&&[“$n”-lt 10]&&&[“$m”-eq 0];执行
是一个无限循环,更改为过时的-a
会产生良好的行为:
而[-L“$file”-a“$n”-lt 10-a“$m”-等式0];执行
我该怎么办?第一个表达式适用于许多机器,但这台机器不适用,因为它似乎需要第二个表达式…Per:
>4个论点:
结果不详
因此,除了XSI扩展之外,POSIX并没有说明它是如何工作的
此外,即使在具有XSI扩展的系统上:
expression1-a expression2
:如果expression1和expression2都为True,则为True;否则,错误。-a二进制主对象是左关联的。它的优先级高于-o。[选项结束]
expression1-o expression2
:如果expression1或expression2为True,则为True;否则,错误。-o二进制主对象是左关联的。[选项结束]
没有关于短路的规范
如果您想要短路行为或POSIX定义的行为,请使用
&
和|
连接多个单独的测试调用
再次引用文件后面的内容: 应用程序使用 指定-a和-o二元原色以及“('和')”运算符的XSI扩展已标记为过时。(许多使用它们的表达式由语法根据所计算的特定表达式进行模糊定义。)使用这些表达式的脚本应转换为下面给出的形式。尽管许多实现将继续支持这些过时的表单,但脚本在处理用户提供的输入时应该非常小心,因为这些输入可能会与这些以及其他原语和运算符混淆。除非应用程序开发人员知道产生脚本输入的所有情况,否则调用如下:
test "$1" -a "$2"
应写为:
test "$1" && test "$2"
好吧,你已经知道了这些行为,所以这个问题实际上是关于如何解释这些结果。但是TBH,没有很多真实的场景可以让你观察到不同的行为 我创建了一个小测试用例来检查发生了什么(至少,在我的系统上,因为另一个答案表明它没有标准化): 如果检查输出,您将看到bash正在查找该文件,因此答案是:
操作员不会短路。顺便说一句,他们已经被弃用了--你根本不应该使用他们。不要使用
-a
和-o
他们是。否则,该行的语法没有问题(尽管逻辑不正确,因为第二个表达式将抛出语法错误,因为“
不是整数值)。(所以是的,似乎-a
不是短路。)(谢谢,编辑了问题,包括使用过时运算符的原因)关于无限循环,我强烈建议使用set-x
来调试为什么会出现这种行为。毕竟,这三个测试中的一个是,在这种情况下做一些与您期望的不同的事情(或者,更可能的是,您期望使其中一个测试失败的循环中的内容没有)。找到实际问题的根源比试图依靠非标准行为来解决问题更有用。我用一个简单的例子创建了一个单独的问题:
strace bash -c "if [ 0 -eq 1 -a -e "/nosuchfile" ]; then echo X; fi"