Bash For Loop Array: Iterate Through Array Values

by on April 13, 2008 · 7 comments· LAST UPDATED October 27, 2009

in , ,

How do I use bash for loop to iterate thought array values under UNIX / Linux operating systems?

The Bash provides one-dimensional array variables. Any variable may be used as an array; the declare builtin will explicitly declare an array. There is no maximum limit on the size of an array, nor any requirement that members be indexed or assigned contiguously. Arrays are indexed using integers and are zero-based.

To declare an array in bash

Declare and an array called array and assign three values:

array=( one two three )

More examples:

files=( "/etc/passwd" "/etc/group" "/etc/hosts" )
limits=( 10, 20, 26, 39, 48)

To print an array use:

printf "%s\n" "${array[@]}"
printf "%s\n" "${files[@]}"
printf "%s\n" "${limits[@]}"

To Iterate Through Array Values

Use for loop syntax as follows:

for i in "${arrayName[@]}"
do
   :
   # do whatever on $i
done

$i will hold each item in an array. Here is a sample working script:

#!/bin/bash
# declare an array called array and define 3 vales
array=( one two three )
for i in "${array[@]}"
do
	echo $i
done
TwitterFacebookGoogle+PDF versionFound an error/typo on this page? Help us!

{ 7 comments… read them below or add one }

1 Peter March 6, 2009 at 3:26 pm

Defining the array with double parentheses gave me an error. Using single parentheses did not and worked just fine. This tip mixes them, showing double parentheses at the top, but then using single parentheses in the for loop.

Reply

2 alok August 10, 2009 at 7:55 am

HI
Want to know , how to create a Two dimension array in bash and print all in one go.
eg like in one dimension array,
echo ${array[@]}
What for two dimension array ??

Thanks in advance…

Reply

3 Ziad November 24, 2011 at 6:32 pm

The double quotes are not necessary around ${array[@]}. This expression gets evaluated properly anyway.

Reply

4 ushi February 25, 2012 at 1:58 pm

ist there a nice way of doin this backwards? at the moment im writing something like this:

for ((i=${#ARRAY[@]}; i > 0; i–)); do echo ${ARRAY[$i]}; done

Reply

5 Jorge Braz April 8, 2012 at 2:55 pm

http://www.linuxjournal.com/content/bash-arrays

${arr[*]} # All of the items in the array
${!arr[*]} # All of the indexes in the array
${#arr[*]} # Number of items in the array
${#arr[0]} # Length of item zero

for index in ${!array[*]}
do
printf “%4d: %s\n” $index ${array[$index]}
done

Reply

6 koni December 11, 2012 at 12:39 pm

I tried looping through a directory of approx 80 files. I looped trough them and placed them into an Array. Then I did a nested loop through the array to find duplicated (case insensitive) dir names.

But this is just as slow as looping straight through the dirs using For x in ./*..

Can someone with explain this?

Reply

7 Chris F.A. Johnson December 15, 2012 at 6:22 pm

A loop is a loop. It is slow.

It doesn’t matter whether you are looping through array elements or filenames, it’s the same thing.

Assigning filenames to an array is fast if you can use pathname expansion:

allfiles=( * )   ## 'shopt -s dotglob' if you want dot files included
textfiles=( *.txt )

Merely printing elements of an array doesn’t require a loop:

printf "%s\n" "${textfiles[@]}"  ## yes, the double quotes ARE necessary

Reply

Leave a Comment

Tagged as: , , , , , , , , , , , , , , , , ,

Previous Faq:

Next Faq: