Loop through an array of strings in Bash?

ID : 517

viewed : 114

Tags : arraysbashshellarrays

Top 5 Answer for Loop through an array of strings in Bash?

vote vote

97

You can use it like this:

## declare an array variable declare -a arr=("element1" "element2" "element3")  ## now loop through the above array for i in "${arr[@]}" do    echo "$i"    # or do whatever with individual element of the array done  # You can access them using echo "${arr[0]}", "${arr[1]}" also 

Also works for multi-line array declaration

declare -a arr=("element1"                  "element2" "element3"                 "element4"                 ) 
vote vote

82

That is possible, of course.

for databaseName in a b c d e f; do   # do something like: echo $databaseName done  

See Bash Loops for, while and until for details.

vote vote

80

None of those answers include a counter...

#!/bin/bash ## declare an array variable declare -a array=("one" "two" "three")  # get length of an array arraylength=${#array[@]}  # use for loop to read all values and indexes for (( i=0; i<${arraylength}; i++ )); do   echo "index: $i, value: ${array[$i]}" done 

Output:

index: 0, value: one index: 1, value: two index: 2, value: three 
vote vote

69

Yes

for Item in Item1 Item2 Item3 Item4 ;   do     echo $Item   done 

Output:

Item1 Item2 Item3 Item4 

To preserve spaces; single or double quote list entries and double quote list expansions.

for Item in 'Item 1' 'Item 2' 'Item 3' 'Item 4' ;   do     echo "$Item"   done 

Output:

Item 1 Item 2 Item 3 Item 4 

To make list over multiple lines

for Item in Item1 \             Item2 \             Item3 \             Item4   do     echo $Item   done 

Output:

Item1 Item2 Item3 Item4 

Simple list variable
List=( Item1 Item2 Item3 ) 

or

List=(       Item1        Item2        Item3      ) 

Display the list variable:

echo ${List[*]} 

Output:

Item1 Item2 Item3 

Loop through the list:

for Item in ${List[*]}    do     echo $Item    done 

Output:

Item1 Item2 Item3 

Create a function to go through a list:

Loop(){   for item in ${*} ;      do        echo ${item}      done } Loop ${List[*]} 

Using the declare keyword (command) to create the list, which is technically called an array:

declare -a List=(                  "element 1"                   "element 2"                   "element 3"                 ) for entry in "${List[@]}"    do      echo "$entry"    done 

Output:

element 1 element 2 element 3 

Creating an associative array. A dictionary:

declare -A continent  continent[Vietnam]=Asia continent[France]=Europe continent[Argentina]=America  for item in "${!continent[@]}";    do     printf "$item is in ${continent[$item]} \n"   done 

Output:

 Argentina is in America  Vietnam is in Asia  France is in Europe 

CSV variables or files in to a list.
Changing the internal field separator from a space, to what ever you want.
In the example below it is changed to a comma

List="Item 1,Item 2,Item 3" Backup_of_internal_field_separator=$IFS IFS=, for item in $List;    do     echo $item   done IFS=$Backup_of_internal_field_separator 

Output:

Item 1 Item 2 Item 3 

If need to number them:

`  

this is called a back tick. Put the command inside back ticks.

`command`  

It is next to the number one on your keyboard and or above the tab key, on a standard American English language keyboard.

List=() Start_count=0 Step_count=0.1 Stop_count=1 for Item in `seq $Start_count $Step_count $Stop_count`     do         List+=(Item_$Item)     done for Item in ${List[*]}     do          echo $Item     done 

Output is:

Item_0.0 Item_0.1 Item_0.2 Item_0.3 Item_0.4 Item_0.5 Item_0.6 Item_0.7 Item_0.8 Item_0.9 Item_1.0 

Becoming more familiar with bashes behavior:

Create a list in a file

cat <<EOF> List_entries.txt Item1 Item 2  'Item 3' "Item 4" Item 7 : * "Item 6 : * " "Item 6 : *" Item 8 : $PWD 'Item 8 : $PWD' "Item 9 : $PWD" EOF 

Read the list file in to a list and display

List=$(cat List_entries.txt) echo $List echo '$List' echo "$List" echo ${List[*]} echo '${List[*]}' echo "${List[*]}" echo ${List[@]} echo '${List[@]}' echo "${List[@]}" 

BASH commandline reference manual: Special meaning of certain characters or words to the shell.

vote vote

56

In the same spirit as 4ndrew's answer:

listOfNames="RA RB R C RD"  # To allow for other whitespace in the string: # 1. add double quotes around the list variable, or # 2. see the IFS note (under 'Side Notes')  for databaseName in "$listOfNames"   #  <-- Note: Added "" quotes. do   echo "$databaseName"  # (i.e. do action / processing of $databaseName here...) done  # Outputs # RA # RB # R C # RD 

B. No whitespace in the names:

listOfNames="RA RB R C RD"  for databaseName in $listOfNames  # Note: No quotes do   echo "$databaseName"  # (i.e. do action / processing of $databaseName here...) done  # Outputs # RA # RB # R # C # RD 

Notes

  1. In the second example, using listOfNames="RA RB R C RD" has the same output.

Other ways to bring in data include:

Read from stdin

# line delimited (each databaseName is stored on a line) while read databaseName do   echo "$databaseName"  # i.e. do action / processing of $databaseName here... done # <<< or_another_input_method_here 
  1. the bash IFS "field separator to line" [1] delimiter can be specified in the script to allow other whitespace (i.e. IFS='\n', or for MacOS IFS='\r')
  2. I like the accepted answer also :) -- I've include these snippets as other helpful ways that also answer the question.
  3. Including #!/bin/bash at the top of the script file indicates the execution environment.
  4. It took me months to figure out how to code this simply :)

Other Sources (while read loop)

Top 3 video Explaining Loop through an array of strings in Bash?

Related QUESTION?