只是想知道这是否:
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"
除了test
and[
结构之外,还有“现代”[[
测试命令,它并不完全接受-o
,而是接受||
.
因此,所有这些都是有效且等效的:
一个
[[
测试:if [[ $first_arg == major || $first_arg == minor ]]; then exit 1; fi
两项
[[
测试:if [[ $first_arg == major ]] || [[ $first_arg == minor ]]; then exit 1; fi
两项
[
测试(相当于标准):if [ "$first_arg" = major ] || [ "$first_arg" = minor ]; then exit 1; fi
$first_arg
内部不需要双引号[[
,因为那里没有分词或路径名扩展。[
但是,引号应与 一起使用。引用minor
也没有意义major
。不仅在这里,而且与test
或[
也。那是因为它们是简单的字符串。
1. 请参阅应用程序的使用。
答案2
由于您的两个表达式均无效,因此存在准等价;-)
请注意,这==
仅对非标准[[
运算符有效。
一般来说:使用test
内置函数时,建议仅使用简单的表达式,因为在应用参数扩展的情况下,较大的表达式可能会导致不可预测的结果。
由于test
大约已内置于外壳中。 35 年来,调用更简单的test
命令并在 shell 级别组合它们不再是性能问题。