bash中的'if [“ x $ foo” =“ x1”]'与'if [“ $ foo” =“ 1”]'之间的区别?

时间:2019-08-25 21:29:10

标签: bash conditional-statements

我正在阅读Gitlab的源代码,以了解有关其工作原理的更多信息。在项目根目录内的run bash script中,看到以下内容:

if [ "x$GDK_RUNIT" = "x1" ]; then
  ...
fi

我知道此条件的目的是检查GDK_RUNIT envar的值是否设置为等于1,并且在这种情况下以非零返回码退出。我的问题是,以上代码与以下代码有什么区别?

if ["$GDK_RUNIT" = "1" ]; then
  ...
fi

换句话说,在envar名称和“ 1”之前放置“ x”的目的是什么?

我检查了man test中与x相关的任何内容(因为我知道iftest在功能上是等效的),但我所看到的只是-x旗。

x$GDK_RUNIT对我来说似乎不是一个标志,所以我认为man页面的内容不相关。

1 个答案:

答案 0 :(得分:2)

完全没有必要。 test old 实现无法处理空参数,因此,如果GDK_RUNIT未定义或为空,则避免使用[ "" = "1" ]的等效项,而将其替换为改为[ "x" = "x1" ]。几乎任何字符或字符串都可以代替x,但是x的使用是常规的。

但是,没有合理的现代实现方式,当然也没有bash的实现方式会出现此问题。