为什么在 [ x"$VAR" = x"VALUE" ] 中使用“x”?

问题描述 投票:0回答:4

我可以在 unix shell 脚本中看到使用了以下构造

[ x"$VAR" = x"VALUE" ] 

而不是

[ "$VAR" = "VALUE" ] 

为什么?

shell unix
4个回答
10
投票

因为如果其中一个变量为空,shell 并不总是完全表现良好。

考虑如果

$VAR
为空/null 并且
$VALUE
为“foo”,则您的两个构造将扩展为:

[ x = xfoo ]

[ = foo ]

后者会因为非法构造而在某些 shell 中导致错误,而前者在任何情况下都是有效的。这在最新版本的 bash(甚至可能是旧版本的 bash)中不是问题,但这就是它的历史来源 - 除了与您处境相同的人偶尔感到困惑之外,没有什么理由这样做与更广泛的外壳兼容。


4
投票

$VAR
为空时,会给出语法错误
[ = "VALUE"]
,因此 x 的使用永远不会扩展为空值。 但由于
"$VAR"
在您的示例中被引用,这应该不是问题,因为
[ '' = 'VALUE' ]
是一个有效的表达式。

它还可以防止 VAR 值被

[
/
test
解释为特殊标志,例如
VAR=-f
test
的正确实现不应因此而混淆。


1
投票

这是一种古老的技术,可以防止比较的任一侧为空。有些 shell 无法正确处理空字符串。


0
投票

您已经有了解释,但这是另一种方法,使用

case/esac
而不是
if/else

case "$VAR" in 
  "$VALUE" ) echo 'yes';;
  * ) echo 'no' ;;
esac
© www.soinside.com 2019 - 2024. All rights reserved.