“x $ VARIABLE”中x的shell脚本用途

时间:2009-11-26 21:13:00

标签: unix 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

3 个答案:

答案 0 :(得分:17)

如果其中一个变量为空,那么确保在替换中不会得到空字符串是一种技巧。通过将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 [ "" != "" ]

答案 1 :(得分:6)

这个问题与奇数球的价值有关,正如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,可以避免这种误解。

答案 2 :(得分:1)

如果变量是空字符串或未初始化,没有 xif在变量替换后将如下所示:

 if [ != ]; then

因此会失败,因为缺少操作数。 使用 xif如下所示:

 if [ x != x]; then

在语法上有效。