假设我们有一组变量,我们想要测试它们是否已定义,如果其中任何一个变量未定义,则设置一个条件。
我正在考虑继续进行以下操作:
#!/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]
匹配的最后一个元素的索引。pattern
0
或者您可以使用以下方法计算空元素的数量:
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