2 votos

No se puede comprobar si la clave existe en el array asociativo de zsh

Este es mi script (zsh 5.8):

# Consider parameter expansion of an unset variable to be an error
set -u  

# Define and populate associative array
typeset -A arr 
arr=(x xxx y yyy)

echo $arr[x] # Outputs xxx

# Test whether key x is present
((${arr[(Ie)x]})) && echo true

La última línea me da el error zsh: x: parámetro no establecido y de este mensaje concluyo que zsh trata el x no literalmente, sino como una variable que zsh quiere expandir. ¿Por qué tengo una expansión de variables aquí, y cómo puedo escribir la prueba (sin violar set -u ) para comprobar que la clave x está presente en la matriz?

Sé que, por supuesto, puedo escribir un bucle explícito sobre las claves (es decir for k in ${(k)arr} pero sospecho que debe haber una manera más fácil de lograrlo.

3voto

staffan Puntos 3299

Dado que la clave x está presente en arr , ${arr[(Ie)x]} se expande a la lista de claves que coinciden con x , que es sólo x . El resultado es la expresión aritmética x que se evalúa con el valor numérico de x . Pero x no está establecido, de ahí el error que se ve.

En general, cuidado con las matrices asociativas en las expresiones aritméticas .

[[ $arr[(Ie)x] ]] funcionaría para una clave no vacía. Otra alternativa, ((${+arr[x]})) es más común, pero no le veo ninguna ventaja: tampoco funciona con llaves vacías. Creo que el $+ funciona para claves arbitrarias si se utiliza una variable intermedia:

key=x # or '' or ']' …
(($+arr[$key]))

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X