测试“ $ @”是否为空-奇怪的结果

时间:2019-02-05 16:22:00

标签: bash special-characters

我正在检查以下代码:

#!/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

然后它可以正常工作。

1 个答案:

答案 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