linux shell - 奇怪'如果&#39 ;?

时间:2015-12-06 23:54:08

标签: linux shell

我正在阅读源代码,并找到以下这些行:

if [ -n "${INIT_NAMENODE+1}" ]
then 
    echo "Initializing namenode"
else 
    echo "Starting namenode"
fi

我应该怎样插入'如果'条件:如果[-n" $ {INIT_NAMENODE + 1}" ]? ?

1 个答案:

答案 0 :(得分:1)

这段代码的优点在于它不是为" Linux shell"而编写的。它是为更一般的类别" UNIX shell"而编写的。至少从V7 UNIX(1979)开始,它将适用于所有方面。具有较低可移植性目标的人可能在没有-n的情况下编写它。

第一个感兴趣的项目是${foo+bar}语法。这是对foo参数存在的测试。如果$foo存在,则${foo+bar}等于bar。如果$foo不存在,则${foo+bar}等于空字符串。

如果你在shell手册页中查找它,它通常会记录为${foo:+bar},以及其他一些相关的表单,例如${foo:-bar},以及附近的某个地方。解释了冒号可以从所有这些中省略,导致行为略有不同(使用冒号,其值为空字符串的变量被视为与不存在的变量相同)。

接下来我们进行[ -n ... ]测试。 -n测试以下字符串是否空虚。如果字符串非空,则成功。从前一段开始,我们知道${INIT_NAMENODE+1}当且仅当$INIT_NAMENODE不存在时才为空。因此,如果-n存在,$INIT_NAMENODE测试会成功。值1在这里并不重要 - 如果您将1更改为20teapot,则会执行相同的操作。重要的是,它不是一个空字符串,因为-n并不关心其余部分。

在shell提示符下尝试一些示例:echo ${PATH+hello}应该说hello,因为您确实有一个$PATH变量。 echo ${asdfghjkl+hello}应该打印一个空行。

因此,在if语句的上下文中,如果变量echo存在,则测试的目的是执行第一个$INIT_NAMENODE,第二个echo如果变量$INIT_NAMENODE不存在。