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

Arrays Bash-检查数组的每个索引是否为空值,arrays,bash,quoting,Arrays,Bash,Quoting,通过下面的代码,我希望检查数组中的每个索引是否有空值、空字符串或仅包含空格的字符串。但是它不起作用 test=( "apple" "orange" " ") for i in ${test[@]}; do if [ -z "$i" ]; then echo "Oh no!" fi done 它从不进入if块。我做错了什么?您的脚本中有几个错误 ${test[@]}中i的未引用数组扩展,在此期间,只有空格的元素被shell忽略 而-z选项只检查空字符串,而不是带空

通过下面的代码,我希望检查数组中的每个索引是否有空值、空字符串或仅包含空格的字符串。但是它不起作用

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

它从不进入if块。我做错了什么?

您的脚本中有几个错误

  • ${test[@]}中i的未引用数组扩展
    ,在此期间,只有空格的元素被shell忽略
  • -z
    选项只检查空字符串,而不是带空格的字符串
  • 你需要有

    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}
    在某种程度上是贪婪的,它替换了所有出现的情况。在您的情况下,将所有空格替换为零(空字符串),这样您就可以通过
    -z
    匹配空字符串,在检查
    -z
    时使用空字符串-而不是空格。循环时用
    ${array[@]}
    括起来

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

    空格不是空的,您还需要引用
    ${test[@]}
    ,因为它当前将删除空白和空值。如果我希望同时检查空白字符串和空白,该怎么办?谢谢,这是我需要的。