Arrays em Zsh. Verifique se alguma das seguintes variáveis não está definida

2

Digamos que temos um conjunto de variáveis que queremos testar se estiverem definidas e definir uma condição, se alguma delas não for.

Estou pensando em continuar com algo como o seguinte:

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

Eu testei com opções diferentes para <variable_x_not_defined> sem sorte. Estou usando o array corretamente aqui? Como posso fazer isso no Zsh?

    
por Amelio Vazquez-Reina 27.10.2015 / 16:59

2 respostas

2

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
    
por 27.10.2015 / 17:29
4

Para verificar se uma matriz contém pelo menos um elemento vazio, você pode fazer:

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

O sinalizador (I) subscrito em $array[(I)pattern] retorna o indice do último elemento que corresponde ao pattern ou 0 se não for encontrado.

Ou você pode contar o número de elementos vazios com:

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

${(M)array[@]:#pattern} expande para os elementos que correspondem a pattern . Adicionar # fornece a contagem.

    
por 04.11.2015 / 12:55