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
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"
oecho "$i=(${ARi]})"
forniscono entrambi un piccolo extra mostrando come ottenere la chiave & var ma in senso strettoecho "$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?
"${array[*]}"
invece di"${array[@]}"
. Lutilizzo di*
invece di@
lo considera più o meno come una stringa anziché come un array.