web-dev-qa-db-fra.com

Accès à la variable d'index du tableau à partir de la boucle de script shell bash?

Je veux accéder à la variable d'index du tableau tout en bouclant à travers un tableau dans mon script shell bash.

#!/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?

21
Mowzer

Vous pouvez le faire en utilisant Liste des clés du tableau . Depuis la page de manuel bash:

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

Liste des clés du tablea. Si nom est une variable de tableau, se développe dans la liste des indices de tableau (clés) attribués dans nom. Si le nom n'est pas un tableau, se développe en 0 si le nom est défini et null sinon. Quand @ est utilisé et l'expansion 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

Il en résulte:

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

Notez que cela fonctionne également 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

Il en résulte:

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

En plus de la réponse de jordanm, vous pouvez également faire une boucle de type C dans bash:

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

vous pouvez faire quelque chose comme ça:

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

production:

0
1
2
3
1
F.9876