Accesso alla variabile dellindice dellarray dal ciclo di script della shell bash?

Voglio accedere alla variabile di indice dellarray durante il ciclo attraverso un array nel mio script di shell bash.

myscript.sh

#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in ${AR[*]}; do echo $i done 

Il risultato dello script precedente è:

foo bar baz bat 

Il risultato che cerco è:

0 1 2 3 

Come modifico il mio script per ottenere ciò?

Commenti

  • Nota inoltre che praticamente non desidera "${array[*]}" invece di "${array[@]}". Lutilizzo di * invece di @ lo considera più o meno come una stringa anziché come un array.

Risposta

Puoi farlo utilizzando Elenco di chiavi di matrice . Dalla pagina man bash:

${!name[@]}
${!name[*]}

Elenco di chiavi array . Se nome è una variabile di matrice, si espande allelenco degli indici di matrice (chiavi) assegnati in nome. Se name non è un array, si espande in 0 se name è impostato e null in caso contrario. Quando viene utilizzato @ e lespansione viene visualizzata tra virgolette doppie, ogni chiave si espande in una parola separata.

Per il tuo esempio:

#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done 

Questo si traduce in:

${AR[0]}=foo ${AR[1]}=bar ${AR[2]}=baz ${AR[3]}=bat 

Tieni presente che anche questo funziona per indici non successivi:

#!/bin/bash AR=([3]="foo" [5]="bar" [25]="baz" [7]="bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done 

Questo si traduce in:

${AR[3]}=foo ${AR[5]}=bar ${AR[7]}=bat ${AR[25]}=baz 

Commenti

  • Sebbene questa risposta raggiunga il risultato desiderato, è inutilmente offuscata dallistruzione printf. Ad esempio: printf "$i=(${AR[i]})\n" o echo "$i=(${ARi]})" forniscono entrambi un piccolo extra mostrando come ottenere la chiave & var ma in senso stretto echo "$i" avrebbe risposto allOP. Il resto è " bash fu " 🙂
  • Perché non è possibile: a=(1 2);echo ${a[0]} # result: 1?

Risposta

Oltre alla risposta di jordanm puoi anche fare un C come loop in bash:

for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done 

Commenti

  • Solo se non era un array sparso …

Risposta

puoi fare qualcosa del genere:

 #!/bin/bash AR=("foo" "bar" "baz" "bat") length=${#AR[@]} for (( i = 0; i < length; i++ )); do echo "$i" done  

output:

0 1 2 3 

Commenti

  • Cosa significa questo la risposta di pfnuesel non dice già?
  • Potrei sbagliarmi, ma la risposta di pfnuesel non rivaluta la lunghezza dellarray ad ogni iterazione?

Lascia un commento

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