在Bash中检查数组是否为空

20

我正在尝试在Bash中检查一个数组是否为空

key=[]
key1=["2014"]

我尝试了以下方法:

[[ -z "$key" ]] && echo "empty" || echo "not Empty" 
[[ -z "$key1" ]] && echo "empty" || echo "not Empty"

两个都返回“not Empty”

[[ $key==[] ]] && echo "empty" || echo "not Empty"
[[ $key1==[] ]] && echo "empty" || echo "not Empty"

两者都返回“empty”。


3
key=[]不是一个数组;它是一个普通的变量,其值为[]。Bash实际上没有空数组:它有未设置的变量(可能具有数组属性),以及已分配一个或多个值的数组变量。 - chepner
啊,我明白了。非常感谢您的评论。我想这是我在@chepner这里应该知道的最重要的事情之一。 - Keru Chen
1个回答

32

如评论中的@cheapner指出,您没有正确定义数组。

key=()
key1=("2014" "kdjg")

key 是一个空数组,key12 个元素。

然后打印出数组中的元素数量,分别为 02

echo "${#key[@]}"
echo "${#key1[@]}"

以下分别输出emptynot empty:

if (( ${#key[@]} == 0 )); then
    echo empty
fi

if (( ${#key1[@]} != 0 )); then
    echo not empty
fi

12
如果您希望确保兼容 POSIX,也许可以使用[ ${#key[@]} -eq 0 ],因为许多 shell 不支持 (( arithmetic )) - dawg
1
@dawg 但是,有没有那种不会出现这种情况的 bash 版本呢?我假设是一个非历史性的 bash :-) - Ted Lyngmo
1
正如所述 - 这个考虑是为了符合 POSIX 标准,而不是 Bash 版本。构造 (( C arithmetic )) 是 Bash 的扩展,不兼容 POSIX。Korn、sh 和其他的都没有这个。但是所有的都有 POSIX 比较... - dawg
3
@dawg 是的,好的,我倾向于在编程语言中使用最方便的内容,并且很少/从不尝试为一组类似的语言找到共同点并仅使用该功能子集。如果我正在使用 bash,那么算术扩展肯定会被使用。 - Ted Lyngmo
@blamb 这个问答看起来不错,但是这个问题标记为 [tag:bash],所以对于使用的是哪个 shell 毫无疑问。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接