我正在偷看一些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,避免了这种误解。
如果变量是一个空字符串或未初始化的, 没有 x
, if
在变量替换之后if
会看起来像这样:
if [ != ]; then
并因此失败,因为操作数丢失。 用 x
, if
看起来像这样:
if [ x != x]; then
这在语法上是有效的。