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?
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
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
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