我在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
得到了两个肯定的检查?
答案 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参数的主要操作符。