我正在查看一些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
答案 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)
如果变量是空字符串或未初始化,没有 x
,if
在变量替换后将如下所示:
if [ != ]; then
因此会失败,因为缺少操作数。 使用 x
,if
如下所示:
if [ x != x]; then
在语法上有效。