Dizionario nello script di shell che mostra solo lultimo elemento associato

Sto cercando di usare dizionari e sono incappato in un comportamento strano. Quando creo un dizionario come questo:

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

Lultimo elemento “prd” verrà stampato sullo schermo, non il primo. Eliminando ogni voce tranne la prima si otterrà loutput corretto. Non sono sicuro di cosa sto facendo di sbagliato perché ogni esempio di codice che ho esaminato utilizza dizionari come sopra. Qualcuno può individuare il mio errore?

Saluti

Commenti

  • Come stai eseguendo lo script?
  • Lo sto eseguendo da bash usando sh binary con root privs
  • Si comporta come se servers fosse un array invece di un array associativo. Verifica la presenza di errori di battitura e verifica che la versione bash sia almeno 4.0 (la prima a supportare gli array associativi).
  • Stai usando sh o bash?
  • Qual è la versione di bash usi (si comporta come se usassi una versione di bash precedente alla 4)?

Risposta

Penso che il commento di @Yurko sia la strada giusta.

Con bash precedente alla versione 4 (come /bin/bash su un Mac):

  1. la riga declare -A genererà un errore (declare: -A: invalid option) e larray è non dichiarato .
  2. la seconda riga creerà un array indicizzato : poiché lindice viene valutato come unespressione aritmetica
  3. nelle espressioni aritmetiche bash: le parole “nude” sono trattate come nomi di variabili e alle variabili non impostate viene assegnato il valore zero

Pertanto, ogni stringa è assegnata a lindice 0.

Prova questo:

 declare -p servers  

e dovresti vedere loutput

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *