3

我在 bash 中的测试语法中犯了一个错误,但现在我想了解使用-nand进行字符串检查时到底发生了什么-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

4

1 回答 1

4

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

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

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

用引号,你得到

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

由于引号强制使用空的第二个参数,因此您有 , 的 2 个参数形式test,并且-X(无论是-n还是-z)被正确识别为作用于第二个 null 参数的主要运算符。

于 2013-05-03T12:49:31.990 回答