使用-z和-n检查bash中的字符串

时间:2013-05-03 09:06:03

标签: string bash conditional

我在bash中的测试语法中犯了一个错误,但现在我想了解在-n-z的字符串检查中发生了什么。 我写了以下几行,以便从LINENUM获取grep变量中的行号。如果找不到该字符串(文件中只有一个,肯定),LINENUM变量为空。

$ LINENUM=$(grep -w -n mystring myfile | cut -d: -f1)
$ echo --$LINENUM--
----
$ if [ -n $LINENUM ] ; then echo "Checked -n"; fi
Checked -n
$ if [ -z $LINENUM ] ; then echo "Checked -z"; fi
Checked -z

然后我意识到我忘记了双引号,然后下面的检查给了我:

$ if [ -n "$LINENUM" ] ; then echo "Checked -n"; fi
$ if [ -z "$LINENUM" ] ; then echo "Checked -z"; fi
Checked -z

所以,在之前的测试中,我忘记了双引号,而不是if测试检查,实际上,因为我从-n-z得到了两个肯定的检查?

1 个答案:

答案 0 :(得分:2)

如果没有引号,您的测试语句(使用任一运算符,此处以-X表示)将减少为

if [ -X ]; then echo "Checked -X"; fi

根据POSIX标准,如果参数为非null,则test(您现在在这里)的单参数形式为真。由于文字字符串-X非空(它不再是运算符),因此它的计算结果为真。

使用引号,你得到

if [ -X "" ]; then echo "Checked -X"; fi

由于引号强制为空的第二个参数,因此您使用test的2参数形式,-X-n-z)被正确识别为作为第2个null参数的主要操作符。