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

use*_*471 10 shell posix sh

test运营商-a-o短路?

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

  1. -a 不会短路
  2. 或者test希望在开始之前对所有格式进行适当格式化并且仍然短路.

结果导致我创建一个嵌套,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

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

Cha*_*ffy 5

根据POSIX规范进行测试:

> 4个参数:结果未指定.

因此,除了XSI扩展,POSIX没有说明这是如何表现的.

而且,即使在具有 XSI扩展的系统:

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

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

没有关于短路的规范.


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


从文档后面再次引用:

申请使用

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

test "$1" -a "$2"
Run Code Online (Sandbox Code Playgroud)

应该写成:

test "$1" && test "$2"
Run Code Online (Sandbox Code Playgroud)