使用 or 运算符的类似测试表达式?

使用 or 运算符的类似测试表达式?

只是想知道这是否:

if [ "$first_arg" == "major" ] || [ "$first_arg" == "minor" ]; then
        exit 1;
fi

与此相同:

if [ "$first_arg" == "major" || "$first_arg" == "minor" ]; then
      exit 1;
fi

答案1

他们不一样。事实上[ "$first_arg" == "major" || "$first_arg" == "minor" ]甚至不是一个有效的表达。

这是因为[是一个相当于命令,test并且他们不能使用||在命令间级别上运行的替代命令。从历史上看,可以认为正确的替代方案是-o,但是它现在被 POSIX 标记为已过时1、建议重写

test "$1" -o "$2"

进入

test "$1" || test "$2"

除了testand[结构之外,还有“现代”[[测试命令,它并不完全接受-o,而是接受||.

因此,所有这些都是有效且等效的:

  1. 一个[[测试:

    if [[ $first_arg == major || $first_arg == minor ]]; then
        exit 1;
    fi
    
  2. 两项[[测试:

    if [[ $first_arg == major ]] || [[ $first_arg == minor ]]; then
        exit 1;
    fi
    
  3. 两项[测试(相当于标准):

    if [ "$first_arg" = major ] || [ "$first_arg" = minor ]; then
        exit 1;
    fi
    

$first_arg内部不需要双引号[[,因为那里没有分词或路径名扩展。[但是,引号应与 一起使用。引用minor也没有意义major。不仅在这里,而且与test[也。那是因为它们是简单的字符串。

1. 请参阅应用程序的使用。

答案2

由于您的两个表达式均无效,因此存在准等价;-)

请注意,这==仅对非标准[[运算符有效。

一般来说:使用test内置函数时,建议仅使用简单的表达式,因为在应用参数扩展的情况下,较大的表达式可能会导致不可预测的结果。

由于test大约已内置于外壳中。 35 年来,调用更简单的test命令并在 shell 级别组合它们不再是性能问题。

相关内容