我正在阅读源代码,并找到以下这些行:
if [ -n "${INIT_NAMENODE+1}" ]
then
echo "Initializing namenode"
else
echo "Starting namenode"
fi
我应该怎样插入'如果'条件:如果[-n" $ {INIT_NAMENODE + 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
更改为2
或0
或teapot
,则会执行相同的操作。重要的是,它不是一个空字符串,因为-n
并不关心其余部分。
在shell提示符下尝试一些示例:echo ${PATH+hello}
应该说hello
,因为您确实有一个$PATH
变量。 echo ${asdfghjkl+hello}
应该打印一个空行。
因此,在if
语句的上下文中,如果变量echo
存在,则测试的目的是执行第一个$INIT_NAMENODE
,第二个echo
如果变量$INIT_NAMENODE
不存在。