Noto que for x in $d
ignora strings vazias:
VAR1=a
VAR2=
VAR3=c
d=("$VAR1" "$VAR2" "$VAR3")
for x in $d; do
echo $x
done
a
c
(observe a linha vazia ausente entre a
e c
)
Usando a expansão de matriz compatível com bash e ksh, "${d[@]}"
parece fazer o truque:
VAR1=a
VAR2=
VAR3=c
d=("$VAR1" "$VAR2" "$VAR3")
for x in "${d[@]}"; do
echo $x
done
a
c
Assim, o seu script pode fazer:
#!/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
Observe também que a forma for x in $d
assume que a opção KSH_ARRAYS
não está definida, o que pode nem sempre ser verdade.
Como alternativa, você pode definir a matriz para os nomes das variáveis em vez dos valores e, em seguida, usar um "nameref" dentro do loop. Dessa forma, a cotação é mais simples e você pode ver quais variáveis não foram definidas.
#!/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