Je veux accéder à la variable dindex du tableau tout en faisant une boucle sur un tableau dans mon script shell bash.
myscript.sh
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in ${AR[*]}; do echo $i done
Le résultat du script ci-dessus est:
foo bar baz bat
Le résultat que je recherche est:
0 1 2 3
Comment puis-je modifier mon script pour y parvenir?
Commentaires
Réponse
Vous pouvez le faire en utilisant la Liste des clés du tableau . Depuis la page de manuel bash
:
${!name[@]}
${!name[*]}
Liste des clés du tableau . Si nom est une variable de tableau, se développe jusquà la liste des indices de tableau (clés) affectés par nom. Si nom nest pas un tableau, se développe en
0
si nom est défini et nul dans le cas contraire. Lorsque@
est utilisé et que le développement apparaît entre guillemets, chaque clé se développe en un mot distinct.
Pour votre exemple:
#!/bin/bash AR=("foo" "bar" "baz" "bat") for i in "${!AR[@]}"; do printf "${AR[%s]}=%s\n" "$i" "${AR[i]}" done
Cela donne:
${AR[0]}=foo ${AR[1]}=bar ${AR[2]}=baz ${AR[3]}=bat
Notez que ceci aussi travail pour les index non successifs:
#!/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
Cela se traduit par:
${AR[3]}=foo ${AR[5]}=bar ${AR[7]}=bat ${AR[25]}=baz
Commentaires
- Bien que cette réponse accomplisse le résultat souhaité, elle est inutilement obscurcie par linstruction printf. Par exemple:
printf "$i=(${AR[i]})\n"
ouecho "$i=(${ARi]})"
donnent tous deux un petit plus en montrant comment obtenir la clé & var mais à proprement parlerecho "$i"
aurait répondu à lOP. Le reste est " bash fu " 🙂 - Pourquoi nest-ce pas possible:
a=(1 2);echo ${a[0]} # result: 1
?
Réponse
En plus de la réponse de jordanm, vous pouvez également faire une C
comme boucle dans bash
:
for ((idx=0; idx<${#array[@]}; ++idx)); do echo "$idx" "${array[idx]}" done
Commentaires
- Uniquement sil ne sagissait pas dun tableau fragmenté …
Réponse
vous pouvez faire quelque chose comme ceci:
#!/bin/bash AR=("foo" "bar" "baz" "bat") length=${#AR[@]} for (( i = 0; i < length; i++ )); do echo "$i" done
résultat:
0 1 2 3
Commentaires
- Quest-ce que cela signifie que La réponse de pfnuesel ne le dit pas déjà?
- Je me trompe peut-être mais la réponse de pfnuesels ne réévalue pas la longueur du tableau à chaque itération?
"${array[*]}"
au lieu de"${array[@]}"
. Utiliser*
au lieu de@
le traite plus ou moins comme une chaîne au lieu dun tableau.