在“x $ VARIABLE”中x的shell脚本目的

我正在偷看一些shell脚本 – 在comarison shcu中x的目的是什么

if [ "x$USER" != "x$RUN_AS_USER" ]; then su - $RUN_AS_USER -c "$CATALINA_HOME/bin/startup.sh" else $CATALINA_HOME/bin/startup.sh fi 

如果其中一个变量是空的,确保您不会在替换中获得空字符串。 通过把x放在两边,直接比较变量是一样的,但是双方总是非空的。

这是一个古老的kludge,更有意义的脚本写成:

 if [ x$USER != x$RUN_AS_USER ] 

在那里,如果你只有$USER而且它是空的,那么你最终可能会结束

 if [ != root ] # Syntax error 

随着x你得到这个,这是更好的:

 if [ x != xroot ] 

但是,当变量被引用时, x是不必要的,因为引号中的空字符串不会被完全删除。 它仍然显示为一个令牌。 从而

 if [ "$USER" != "$RUN_AS_USER" ] # Best 

是写这个最好的方法。 在最坏的情况下,两个变量都是空的,你会得到这是一个有效的陈述:

 if [ "" != "" ] 

问题与奇球价值有关,正如克里斯蒂安·丘皮图(Cristian Ciupitu)所说的那样,但空串并不是问题(至少在引用整个价值的时候不是这样)。 这个问题与可能与运营商混淆的名字有关(或者' [ ';在某些系统上确实有一个程序/bin/[ )“。 POSIX标准几乎使这个冗余,但考虑如果'$ USER'是'-f','$ RUN_AS_USER'是空的并且不使用x和引号会发生什么。

 if [ -f != ] then : someone has a file called '!=' else : they don't have a file called '!=' fi 

通过使用引号和前导x,避免了这种误解。

如果变量是一个空字符串或未初始化的, 没有 xif在变量替换之后if会看起来像这样:

  if [ != ]; then 

并因此失败,因为操作数丢失。 xif看起来像这样:

  if [ x != x]; then 

这在语法上是有效的。