Bird
Raised Fist0
Bash Scriptingscripting~10 mins

Iterating over arrays in Bash Scripting - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Iterating over arrays
Define array
↓
Start loop: for each element
↓
Access current element
↓
Execute commands with element
↓
Next element?
Yes→Repeat loop
No↓
End loop
This flow shows how a bash script defines an array, then loops over each element to run commands, repeating until all elements are processed.
Execution Sample
Bash Scripting
arr=(apple banana cherry)
for fruit in "${arr[@]}"; do
  echo "$fruit"
done
This script loops over each fruit in the array and prints it.
Execution Table
IterationVariable fruitActionOutput
1applePrint fruitapple
2bananaPrint fruitbanana
3cherryPrint fruitcherry
--Loop endsAll elements processed
💡 All elements in the array have been iterated, loop ends.
Variable Tracker
VariableStartAfter 1After 2After 3Final
fruitundefinedapplebananacherrycherry
Key Moments - 2 Insights
Why do we use "${arr[@]}" instead of just "${arr}" in the loop?
Using "${arr[@]}" expands to all elements separately, so the loop iterates over each item. Using "${arr}" would treat the whole array as one string, causing only one iteration. See execution_table rows 1-3 where each fruit is printed separately.
What happens if the array is empty?
The loop body does not execute at all because there are no elements to iterate. The exit_note confirms the loop ends immediately with no output.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of 'fruit' during iteration 2?
Aapple
Bcherry
Cbanana
Dundefined
💡 Hint
Check the 'Variable fruit' column in execution_table row for iteration 2.
At which iteration does the loop stop iterating over the array?
AAfter iteration 2
BAfter iteration 3
CAfter iteration 1
DNever stops
💡 Hint
Look at the exit_note and the last iteration number in execution_table.
If we change the array to arr=(dog cat), how many iterations will the loop run?
A2
B3
C1
D0
💡 Hint
Refer to variable_tracker and execution_table to see how iterations relate to array length.
Concept Snapshot
Bash array iteration:
Define array: arr=(item1 item2 ...)
Loop: for var in "${arr[@]}"; do ... done
Each loop var holds one element
Use "${arr[@]}" to expand all elements
Loop ends after last element
Full Transcript
This lesson shows how to loop over arrays in bash scripting. First, you define an array with multiple items. Then, you use a for loop with "${arr[@]}" to access each element one by one. Inside the loop, you can run commands using the current element. The loop repeats until all elements are processed. Using "${arr[@]}" is important because it expands each element separately. If the array is empty, the loop does not run. The example prints each fruit in the array on its own line.

Practice

(1/5)
1. What is the correct way to iterate over all elements in a Bash array named fruits?
easy
A. for fruit in ${fruits[*]}; do echo "$fruit"; done
B. for fruit in ${fruits}; do echo "$fruit"; done
C. for fruit in "${fruits[@]}"; do echo "$fruit"; done
D. for fruit in fruits; do echo "$fruit"; done

Solution

  1. Step 1: Understand array iteration syntax

    In Bash, to iterate over all elements of an array safely, you use "${array[@]}" which expands each element as a separate word, preserving spaces.
  2. Step 2: Check each option's correctness

    for fruit in "${fruits[@]}"; do echo "$fruit"; done uses "${fruits[@]}" correctly. Options B and C omit quotes or use ${fruits} or ${fruits[*]} without quotes, which can break elements with spaces. for fruit in fruits; do echo "$fruit"; done treats fruits as a string, not an array.
  3. Final Answer:

    for fruit in "${fruits[@]}"; do echo "$fruit"; done -> Option C
  4. Quick Check:

    Use "${array[@]}" to iterate safely [OK]
Hint: Always quote "${array[@]}" to handle spaces safely [OK]
Common Mistakes:
  • Not quoting "${array[@]}" causing word splitting
  • Using ${array} instead of ${array[@]}
  • Iterating over the array name as a string
2. Which of the following is the correct syntax to iterate over an array colors in Bash?
easy
A. for color in colors; do echo $color; done
B. for color in ${colors}; do echo $color; done
C. for color in ${colors[@]}; do echo $color; done
D. for color in "${colors[@]}"; do echo $color; done

Solution

  1. Step 1: Identify correct quoting for array iteration

    To iterate over array elements safely, you must quote "${array[@]}" to preserve elements with spaces.
  2. Step 2: Evaluate each option

    for color in "${colors[@]}"; do echo $color; done correctly uses quotes around "${colors[@]}". for color in colors; do echo $color; done treats 'colors' as a string, not an array. for color in ${colors[@]}; do echo $color; done misses quotes, risking word splitting. for color in ${colors}; do echo $color; done uses ${colors} which is incorrect for arrays.
  3. Final Answer:

    for color in "${colors[@]}"; do echo $color; done -> Option D
  4. Quick Check:

    Quote "${array[@]}" for safe iteration [OK]
Hint: Quote "${array[@]}" to avoid splitting elements [OK]
Common Mistakes:
  • Forgetting quotes around "${array[@]}"
  • Using array name without $ or quotes
  • Using ${array} instead of ${array[@]}
3. What will be the output of the following Bash script?
names=("Alice" "Bob Smith" "Charlie")
for name in "${names[@]}"; do
  echo "$name"
done
medium
A. Alice Bob Smith Charlie
B. Alice Bob Smith Charlie
C. Alice Bob Smith Charlie
D. Syntax error

Solution

  1. Step 1: Understand array elements and quoting

    The array has three elements: "Alice", "Bob Smith", and "Charlie". Quoting "${names[@]}" preserves each element as one word, even if it contains spaces.
  2. Step 2: Trace the loop output

    The loop prints each element on its own line: first "Alice", then "Bob Smith", then "Charlie".
  3. Final Answer:

    Alice Bob Smith Charlie -> Option A
  4. Quick Check:

    Quoted "${array[@]}" keeps elements intact [OK]
Hint: Quoted "${array[@]}" keeps multi-word elements together [OK]
Common Mistakes:
  • Assuming elements split on spaces inside quotes
  • Using unquoted ${array[@]} causing word splitting
  • Expecting all elements on one line
4. Identify the error in this Bash script that tries to print all elements of array items:
items=("pen" "notebook" "eraser")
for i in ${items[@]}
do
  echo $i
done
medium
A. Array declaration syntax is wrong
B. Missing quotes around ${items[@]} causes word splitting
C. for loop syntax is incorrect
D. echo command is missing quotes

Solution

  1. Step 1: Check array declaration

    The array declaration is correct with parentheses and quoted elements.
  2. Step 2: Analyze the for loop iteration

    The loop uses unquoted ${items[@]}, which causes word splitting. If any element had spaces, it would split incorrectly. Quoting "${items[@]}" fixes this.
  3. Final Answer:

    Missing quotes around ${items[@]} causes word splitting -> Option B
  4. Quick Check:

    Always quote "${array[@]}" to avoid splitting [OK]
Hint: Quote "${array[@]}" to prevent splitting elements [OK]
Common Mistakes:
  • Not quoting array expansion in loops
  • Assuming echo needs quotes for correctness here
  • Misreading array declaration syntax
5. You have a Bash array files containing filenames, some with spaces. You want to print only those filenames that contain the word "report". Which script correctly iterates and filters the array?
hard
A. for file in "${files[@]}"; do if [[ $file == *report* ]]; then echo "$file"; fi; done
B. for file in ${files[@]}; do if [[ $file == *report* ]]; then echo "$file"; fi; done
C. for file in "${files[*]}"; do if [[ $file == *report* ]]; then echo "$file"; fi; done
D. for file in files; do if [[ $file == *report* ]]; then echo "$file"; fi; done

Solution

  1. Step 1: Choose correct array iteration with quoting

    To handle filenames with spaces correctly, iterate using "${files[@]}" quoted. This preserves each filename as one item.
  2. Step 2: Apply filtering condition inside loop

    The condition [[ $file == *report* ]] correctly checks if the filename contains "report". for file in "${files[@]}"; do if [[ $file == *report* ]]; then echo "$file"; fi; done uses this with proper quoting and iteration.
  3. Final Answer:

    for file in "${files[@]}"; do if [[ $file == *report* ]]; then echo "$file"; fi; done -> Option A
  4. Quick Check:

    Quote "${array[@]}" and filter inside loop [OK]
Hint: Quote "${array[@]}" and filter inside loop with [[ ]] [OK]
Common Mistakes:
  • Using unquoted ${files[@]} splitting filenames
  • Using ${files[*]} which joins all elements into one string
  • Iterating over literal 'files' string
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard