我可以在 unix shell 脚本中看到使用了以下构造
[ x"$VAR" = x"VALUE" ]
而不是
[ "$VAR" = "VALUE" ]
为什么?
因为如果其中一个变量为空,shell 并不总是完全表现良好。
考虑如果
$VAR
为空/null 并且 $VALUE
为“foo”,则您的两个构造将扩展为:
[ x = xfoo ]
和
[ = foo ]
后者会因为非法构造而在某些 shell 中导致错误,而前者在任何情况下都是有效的。这在最新版本的 bash(甚至可能是旧版本的 bash)中不是问题,但这就是它的历史来源 - 除了与您处境相同的人偶尔感到困惑之外,没有什么理由不这样做与更广泛的外壳兼容。
当
$VAR
为空时,会给出语法错误 [ = "VALUE"]
,因此 x 的使用永远不会扩展为空值。
但由于 "$VAR"
在您的示例中被引用,这应该不是问题,因为 [ '' = 'VALUE' ]
是一个有效的表达式。
它还可以防止 VAR 值被
[
/test
解释为特殊标志,例如VAR=-f
。 test
的正确实现不应因此而混淆。
这是一种古老的技术,可以防止比较的任一侧为空。有些 shell 无法正确处理空字符串。
您已经有了解释,但这是另一种方法,使用
case/esac
而不是 if/else
case "$VAR" in
"$VALUE" ) echo 'yes';;
* ) echo 'no' ;;
esac