Arrays en Zsh. Compruebe si alguna de las siguientes variables no está definida

Digamos que tenemos un set de variables que queremos probar si están definidas, y establecemos una condición si ninguna de ellas lo es.

Estoy pensando en proceder con algo como lo siguiente:

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

Probé con diferentes opciones para la condición <variable_x_not_defined> sin suerte. ¿Estoy usando la matriz correctamente aquí? ¿Cómo puedo hacer esto en Zsh?

Noto que for x in $d salta cadenas vacías:

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

(tenga en count la línea vacía que falta entre c )

Usando la expansión de matriz compatible con bash y ksh, "${d[@]}" parece ser el truco:

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

Entonces su script podría hacer:

 #!/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 

También tenga en count que la forma for x in $d asume que la opción KSH_ARRAYS no está establecida, lo que puede no ser siempre cierto.


Alternativamente, puede establecer la matriz en los nombres de las variables en lugar de los valores, y luego usar un "nombreref" dentro del bucle. De esta forma, las citas son más simples, y puede ver qué variables fueron desarmadas.

 #!/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 

Para verificar si una matriz contiene al less un elemento vacío, puede hacer:

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

El indicador de subíndice $array[(I)pattern] devuelve el índice del último elemento que coincide con el pattern o 0 si no se encuentra.

O puede contar la cantidad de elementos vacíos con:

 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 a los elementos que coinciden con el pattern . Agregar # da el conteo.