Bash - 检查数组的每个索引是否为空值

时间:2017-09-15 10:46:35

标签: arrays bash quoting

使用以下代码,我希望检查数组中的每个索引是否为空值,空字符串或仅包含空格的字符串。但它没有用。

test=( "apple" "orange" " ")
for i in ${test[@]};
do
    if [ -z "$i" ]; then
        echo "Oh no!"
    fi
done

它永远不会进入if块。我做错了什么?

2 个答案:

答案 0 :(得分:1)

您的脚本中有几处错误

  1. 未引用的数组扩展for i in ${test[@]};,其间只有空格的元素被shell忽略
  2. -z选项只检查空字符串而不是带空格的字符串
  3. 你需要,

    test=( "apple" "orange" " ")
    for i in "${test[@]}";
    do
        # Replacing single-spaces with empty
        if [ -z "${i// }" ]; then
            echo "Oh no!"
        fi
    done
    

    bash参数扩展语法${MYSTRING//in/by}(或)${MYSTRING//in}以替换所有匹配项的方式贪婪。在您的情况下,将所有白色空格替换为空(null-string),以便您可以将空字符串与-z

    匹配

答案 1 :(得分:0)

使用-z时,请使用空字符串 - 而不是空格。在循环时将${array[@]}""括起来。

test=( "apple" "orange" "")
for i in "${test[@]}";
do
    if [[ -z "$i" ]]; then
        echo "Oh no!"
    fi
done