Zsh 中的数组。检查以下变量是否未定义

Zsh 中的数组。检查以下变量是否未定义

假设我们有一组变量,我们想要测试它们是否已定义,如果其中任何一个变量未定义,则设置一个条件。

我正在考虑继续进行以下操作:

#!/usr/bin/env zsh
d=("$VAR1" "$VAR2" "$VAR3")    
for x in $d;
do
    if <variable_x_not_defined>
       UNDEFINED_VARIABLES="True"
    fi
done

我测试了不同的<variable_x_not_defined>条件选项,但没有运气。我在这里正确使用数组吗?我怎样才能在 Zsh 中做到这一点?

答案1

要检查数组是否至少包含一个空元素,您可以执行以下操作:

if ((i = array[(I)])); then
  echo "array contains at least one empty element (${i}th)"
else
  echo "array doesn't contain empty elements"
fi

如果未找到,则(I)返回与或$array[(I)pattern]匹配的最后一个元素的索引。pattern0

或者您可以使用以下方法计算空元素的数量:

if ((n = ${(M)#array[@]:#})); then
  echo "array contains $n empty elements"
else
  echo "array doesn't contain any empty element"
fi

${(M)array[@]:#pattern}扩展到匹配的元素pattern。添加#得到计数。

答案2

我注意到for x in $d跳过空字符串:

VAR1=a
VAR2=
VAR3=c
d=("$VAR1" "$VAR2" "$VAR3")
for x in $d; do
    echo $x
done

a
c

a(注意和之间缺少空行c

使用 bash 和 ksh 兼容的数组扩展,"${d[@]}"似乎可以解决问题:

VAR1=a
VAR2=
VAR3=c
d=("$VAR1" "$VAR2" "$VAR3")
for x in "${d[@]}"; do
    echo $x
done

a

c

所以你的脚本可以这样做:

#!/usr/bin/env zsh
d=("$VAR1" "$VAR2" "$VAR3")
undefined_variables=false
for x in "${d[@]}"; do
    if [[ -z "${x}" ]]; then
        undefined_variables=true
        break
    fi
done
if $undefined_variables; then
    echo "Found some undefined variables"
fi

另请注意,该for x in $d表单假定KSH_ARRAYS未设置该选项,但这可能并不总是正确的。


或者,您可以将数组设置为名字变量而不是值,然后在循环内使用“nameref”。这样引用就更简单,您可以看到哪些变量未设置。

#!/usr/bin/env zsh
VAR1=a
VAR2=b
VAR3=
vars=(VAR1 VAR2 VAR3)
undefined_variables=false
for var in $vars; do        # or 'for var in "${vars[@]}"' if KSH_ARRAYS might be on
    if [[ -z "${(P)var}" ]]; then
        echo "$var is empty"
        undefined_variables=true
    fi
    # alternatively to test for defined variable as opposed to empty:
    if ((! ${(P)+var})); then
        echo "$var is not set"
        undefined_variables=true
    fi
done

相关内容