测试“$@”是否为 null - 奇怪的结果
Testing the "$@" for being null- strange result
我正在检查以下代码:
#!/usr/bin/env bash
set -o errexit
set -o nounset
if [ -n "$@" ]; then
echo "not null";
else
echo "null";
fi
这意味着如果我像这样调用我的脚本 ./my-script.sh parameter
它应该得到 not null
并且当像这样调用时 ./my-script.sh
它应该说 null
.
Documentation 表示 -z
表示 string is null, that is, has zero length
而 -n
表示 string is not null
.
出于某种原因,我的代码总是声称 $@
不为空。
这是为什么?
当我用 -z
替换 -n
并像这样交换内容时:
if [ -z "$@" ]; then
echo "null";
else
echo "not null";
fi
那么它就可以正常工作了。
"$@"
不是单个字符串:它扩展为可变数量的项目。 如果,比如说,你有 ./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
我正在检查以下代码:
#!/usr/bin/env bash
set -o errexit
set -o nounset
if [ -n "$@" ]; then
echo "not null";
else
echo "null";
fi
这意味着如果我像这样调用我的脚本 ./my-script.sh parameter
它应该得到 not null
并且当像这样调用时 ./my-script.sh
它应该说 null
.
Documentation 表示 -z
表示 string is null, that is, has zero length
而 -n
表示 string is not null
.
出于某种原因,我的代码总是声称 $@
不为空。
这是为什么?
当我用 -z
替换 -n
并像这样交换内容时:
if [ -z "$@" ]; then
echo "null";
else
echo "not null";
fi
那么它就可以正常工作了。
"$@"
不是单个字符串:它扩展为可变数量的项目。 如果,比如说,你有 ./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