2013-10-03 112 views
5

寻找正确的语法来查看bash变量,并确定它是否为null,如果是则执行...否则继续。Bash如果声明为null

也许类似if [ $lastUpdated = null?; then... else...

+0

有bash中没有“空”值。字符串可以是空的或未设置的;你如何设置'$ lastUpdated'的值? –

+1

'null'是什么意思? – zoska

+1

在某些情况下,诸如“$ {lastUpdated:= never}”或“$ {lastUpdated:-never}”等符号可能是合适的。查看[参数扩展](http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion)。 –

回答

10

只是测试,如果变量为空:

if [ -z "$lastUpdated" ]; then 
    # not set 
fi 
+0

空值变量(分配空字符串)和未设置变量之间存在差异;这个答案没有检测到这种区别。 – chepner

+0

@chepner是否有?请详细说明。 – trojanfoe

+0

在任何赋值之前,变量是未设置的。 'FOO ='(没有赋值)相当于'FOO =“”',它将'FOO'的值设置为空字符串。作为例子,各种参数展开('$ {FOO:-default}'vs'$ {FOO-default}')可以让你做出这种区分。未使用变量的引用扩展(如您使用的)扩展为空字符串,因此'-z'无法区分这两个状态。 – chepner

2

扩大对@ chepner的意见,这里是你如何可以测试未设定的(而不是设置为一个可能为空值)变量:

if [ -z "${lastUpdated+set}" ]; then 

${variable+word}语法给出了一个空字符串,如果$variable没有设置,并且串“字”,如果它的设置:

$ fullvar=somestring 
$ emptyvar= 
$ echo "<${fullvar+set}>" 
<set> 
$ echo "<${emptyvar+set}>" 
<set> 
$ echo "<${unsetvar+set}>" 
<> 
+0

你可以放心地在你的表达式中省略引号,使它成为'if [-z $ {lastUpdated + set}];'。[这个SO回答](https://stackoverflow.com/questions/3601515/how-to-check-if-a-variable-is-set-in-bash)给出了详细的解释。 – panepeter

+1

@panepeter确实如此,但我的经验是,只需对引用变量的引用进行双引号比查明何时可以放弃引用变得更加简单和安全。在这种情况下,它需要详细的解释(包括理解[[-z]'做了什么以及为什么),这使得使用双引号更容易。换句话说:如果有人认为'[-z $ {lastUpdated + set}]'是一个测试set变量的好方法,他们可能会推断'[-n $ {lastUpdated + set}] '是测试未设置变量的好方法,但它会完全失败。 –

2

要总括起来:有在bash没有真正值。 Chepner的评论是关于点:

bash文档使用null作为空字符串的同义词。

因此,检查空就意味着检查的空字符串

if [ "${lastUpdated}" = "" ]; then 
    # $lastUpdated is an empty string 
fi 

如果你真的想要做的是检查是否有设置或者为空(即“”,即'')变量,使用trojanfoe的做法:

if [ -z "$lastUpdated" ]; then 
    # $lastUpdated could be "" or not set at all 
fi 

如果你想查天气变量没有设置,但细跟空字符串,戈登·戴维森的答案是要走的路:

if [ -z ${lastUpdated+set} ]; then 
    # $lastUpdated is not set 
fi 

Parameter Expansion是发生了什么事情在这里)

+1

'-eq'用于比较整数;你需要'='来比较字符串。 –