12

I want to access the array index variable while looping thru an array in my bash shell script.

myscript.sh
#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in ${AR[*]}; do
  echo $i
done

The result of the above script is:

foo
bar
baz
bat

The result I seek is:

0
1
2
3

How do I alter my script to achieve this?

  • 5
    Also note that you basically never want "${array[*]}" instead of "${array[@]}". Using * instead of @ more or less treats it as a string instead of an array. – jordanm Apr 23 '16 at 2:40
16

You can do this using List of array keys. From the bash man page:

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

List of array keys. If name is an array variable, expands to the list of array indices (keys) assigned in name. If name is not an array, expands to 0 if name is set and null otherwise. When @ is used and the expansion appears within double quotes, each key expands to a separate word.

For your example:

#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
for i in "${!AR[@]}"; do
  printf '${AR[%s]}=%s\n' "$i" "${AR[i]}"
done

This results in:

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

Note that this also work for non-successive indexes:

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

This results in:

${AR[3]}=foo
${AR[5]}=bar
${AR[7]}=bat
${AR[25]}=baz
  • 1
    Although this answer accomplishes the desired outcome, it is unnecessarily obfuscated by the printf statement. For example: printf "$i=(${AR[i]})\n" or echo "$i=(${ARi]})" both give a little extra by showing how to get key & var but strictly speaking echo "$i" would have answered the OP. The rest is "bash fu" :) – dimmech Jul 4 at 14:05
5

Additional to jordanm's answer you can also do a C like loop in bash:

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

you can do something like this:

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

output:

0
1
2
3
  • 1
    What does this say that  pfnuesel’s answer  doesn’t already say? – G-Man Sep 5 at 19:13
  • I may be mistaken but does pfnuesels answer not re-evaluate the array length on each iteration? – Chris Sep 13 at 8:15

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.