测试“$@”是否为 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