Accès à la variable dindex de tableau à partir de la boucle de script shell bash?

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

  • Notez également que vous ne veulent "${array[*]}" au lieu de "${array[@]}". Utiliser * au lieu de @ le traite plus ou moins comme une chaîne au lieu dun tableau.

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" ou echo "$i=(${ARi]})" donnent tous deux un petit plus en montrant comment obtenir la clé & var mais à proprement parler echo "$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?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *