我有一个数组,充满了不同的错误消息,因为我的脚本运行。
我需要一种方法来检查脚本是否为空,如果是,请采取特定的操作。
我已经试过把它当作正常的VAR来处理,并使用-z来检查它,但这似乎不起作用。 有没有办法来检查数组是否为空或不在Bash?
谢谢
假设你的数组是$errors
,只需检查元素的数量是否为零。
if [ ${#errors[@]} -eq 0 ]; then echo "No errors, hooray" else echo "Oops, something went wrong..." fi
你也可以把数组看作一个简单的variables。 就这样,只是使用
if [ -z "$array" ]; then echo "Array empty" else echo "Array non empty" fi
或使用另一边
if [ -n "$array" ]; then echo "Array non empty" else echo "Array empty" fi
这个解决scheme的问题是,如果一个数组是这样声明的: array=('' foo)
。 这些检查将报告数组为空,而显然不是。 (谢谢@musiphil!)
使用[ -z "$array[@]" ]
显然不是一个解决scheme。 不指定大括号试图将$array
解释为一个string( [@]
在这种情况下是一个简单的文字string),因此总是被报告为false:“是文字string[@]
空吗? 显然不是。
我检查了它与bash-4.4.0
:
#!/usr/bin/env bash set -eu check() { if [[ ${array[@]} ]]; then echo not empty else echo empty fi } check # empty array=(abcd) check # not empty array=() check # empty
和bash-4.1.5
:
#!/usr/bin/env bash set -eu check() { if [[ ${array[@]:+${array[@]}} ]]; then echo non-empty else echo empty fi } check # empty array=(abcd) check # not empty array=() check # empty
在后一种情况下,您需要以下结构:
${array[@]:+${array[@]}}
因为它不会在空或未设置的arrays上失败。 那就是,如果你像我平时那样set -eu
。 这提供了更严格的错误检查。 从文档 :
-e
如果可能由单个简单命令(请参阅简单命令),列表(请参阅列表)或复合命令(请参阅复合命令)组成的pipe道(请参阅pipe道)返回非零状态,请立即退出。 如果失败的命令是命令列表的一部分,那么shell将不会立即退出,直到关键字,if语句中的testing的一部分,以及在&&或||中执行的任何命令的一部分。 除了最后的&&或||之后的命令,pipe道中的最后一个命令,或者命令的返回状态与! 如果复合命令以外的子shell返回非零状态,因为命令失败,而-e被忽略,shell不会退出。 如果设置了ERR,则会在shell退出之前执行陷阱。
此选项单独应用于shell环境和每个子shell环境(请参阅命令执行环境),并且在执行子shell中的所有命令之前可能会导致子shell退出。
如果复合命令或shell函数在忽略-e的上下文中执行,则复合命令或函数体内执行的任何命令都不会受到-e设置的影响,即使-e已设置且命令返回失败状态。 如果复合命令或shell函数在-e被忽略的上下文中执行时设置-e,那么在复合命令或包含函数调用的命令完成之前,该设置将不起作用。
-u
在执行参数扩展时,请将除特殊参数“@”或“*”以外的variables和参数作为error handling。 一条错误消息将被写入标准错误,一个非交互式shell将退出。
如果你不需要,可以省略:+${array[@]}
部分。
另外请注意,使用[[
operator在这里, [
你得到:
$ cat 1.sh #!/usr/bin/env bash set -eu array=(abcd) if [ "${array[@]}" ]; then echo non-empty else echo empty fi $ ./1.sh _/1.sh: line 4: [: too many arguments empty
就我而言, 第二个答案是不够的,因为可能有空格。 我跟着来了
if [ "$(echo -ne ${opts} | wc -m)" -eq 0 ]; then echo "No options" else echo "Options found" fi
我更喜欢使用双括号:
if [[ !${array[@]} ]] then echo "Array is empty" else echo "Array is not empty" fi
双括号: https : //stackoverflow.com/questions/669452/is-preferable-over-in-bash