Diccionario en script de shell que solo muestra el último elemento asociado

Estoy tratando de usar diccionarios y me encontré con un comportamiento extraño. Cuando creo un diccionario como este:

 declare -A servers servers=( ["omega"]="dev" ["delta"]="test" ["beta"]="ppd" ["alpha"]="prd" ) echo "${servers["omega"]}"  

El último elemento «prd» se imprimirá en la pantalla, no en el primero. Eliminar todas las entradas excepto la primera dará como resultado la salida correcta. No estoy seguro de qué estoy haciendo mal porque cada ejemplo de código que he visto usa diccionarios como el anterior. ¿Alguien puede detectar mi error?

Saludos

Comentarios

  • ¿Cómo está ejecutando el script?
  • Lo estoy ejecutando desde bash usando sh binary con root privs
  • Se comporta como si servers fuera una matriz en lugar de una matriz asociativa. Compruebe si hay errores tipográficos y compruebe que la versión de bash sea al menos 4.0 (la primera en admitir matrices asociativas).
  • ¿Está usando sh o bash?
  • ¿Cuál es la versión de bash que usa (se comporta como si usara una versión de bash anterior a la 4)?

Respuesta

Creo que el comentario de @Yurko es el camino correcto.

Con bash antes de la versión 4 (como /bin/bash en una Mac):

  1. la línea declare -A emitirá un error (declare: -A: invalid option) y la matriz es no declarado .
  2. la segunda línea creará una matriz indexada : ya que el índice se evalúa como una expresión aritmética
  3. en expresiones aritméticas bash: las palabras «desnudas» se tratan como nombres de variables; y las variables no configuradas reciben el valor cero

Por lo tanto, cada cadena se asigna a el índice 0.

Prueba esto:

declare -p servers

y debería ver el resultado

 declare -a servers="([0]="prd")"  

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *