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
0si 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.