我正在检查以下代码:
#!/usr/bin/env bash
set -o errexit
set -o nounset
if [ -n "$@" ]; then
echo "not null";
else
echo "null";
fi
这意味着,如果我像这样./my-script.sh parameter
来调用我的脚本,它应该以{{1}}来生成,而当这样被not null
这样调用时,它应该说为./my-script.sh
。
Documentation表示null
表示-z
,而string is null, that is, has zero length
表示-n
。
出于某种原因,我的代码始终声称string is not null
不为空。
为什么?
当我将$@
替换为-n
并像这样交换内容时:
-z
然后它可以正常工作。
答案 0 :(得分:3)
"$@"
不是单个字符串:它扩展为可变数量的项目。例如,如果您有./yourscript one two three
,则[ -n "$@" ]
变为[ -n one two three ]
,这是无效的语法。或者,如果您的参数为零,则它变为[ -n ]
,这是正确的。 ([ -z ]
也是如此,因为[ anything ]
会检查anything
是否为空字符串,而"-z"
是否为非空字符串,就像"-n"
一样)
如果您想知道"$@"
是否为空,请改用$#
,它会告诉您其中包含多少项。
if [ "$#" -eq 0 ]; then
echo "null"
else
echo "not null"
fi