for loop (list-based) in Bash Scripting - Time & Space Complexity
When we use a for loop to go through a list in bash, we want to know how the time it takes changes as the list gets bigger.
We ask: How does the work grow when the list has more items?
Analyze the time complexity of the following code snippet.
items=(apple banana cherry date elderberry)
for item in "${items[@]}"; do
echo "Processing $item"
done
This code goes through each item in a list and prints a message for each one.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for loop runs once for each item in the list.
- How many times: Exactly as many times as there are items in the list.
As the list gets longer, the number of times the loop runs grows the same way.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 10 times |
| 100 | 100 times |
| 1000 | 1000 times |
Pattern observation: The work grows directly with the number of items. Double the items, double the work.
Time Complexity: O(n)
This means the time to finish grows in a straight line with the number of items in the list.
[X] Wrong: "The loop runs a fixed number of times no matter how big the list is."
[OK] Correct: The loop runs once for each item, so if the list grows, the loop runs more times.
Understanding how loops grow with input size helps you explain your code clearly and shows you know how to write efficient scripts.
"What if we nested another for loop inside this one to process pairs of items? How would the time complexity change?"
Practice
for item in apple banana cherry; do echo $item; done
Solution
Step 1: Understand the for loop structure
The loop goes through each word in the list: apple, banana, cherry.Step 2: Check the command inside the loop
It prints each item using echo, so each fruit name appears on its own line.Final Answer:
Prints each fruit name on a new line -> Option AQuick Check:
Loop prints each item line by line = C [OK]
- Thinking echo prints all items on one line
- Confusing list iteration with variable assignment
- Missing the do/done keywords
Solution
Step 1: Identify valid Bash for loop syntax
Bash uses: for variable in list; do commands; doneStep 2: Compare options
Only for item in apple banana cherry; do echo $item; done matches Bash syntax exactly; others use syntax from other languages or invalid forms.Final Answer:
for item in apple banana cherry; do echo $item; done -> Option CQuick Check:
Bash for loop syntax = D [OK]
- Using parentheses or braces like other languages
- Using foreach or loop keywords not in Bash
- Omitting do or done keywords
for word in one two three; do echo "$word"; done
Solution
Step 1: Understand the loop iteration
The loop runs three times, each time echoing one word: one, two, three.Step 2: Understand echo output with quotes
Quotes preserve spaces but echo prints each word on a new line by default.Final Answer:
one two three (each on its own line) -> Option AQuick Check:
Echo prints each item on separate lines = A [OK]
- Thinking echo prints all items on one line
- Confusing literal \n with newline
- Ignoring quotes effect on output
for item apple banana cherry; do echo $item; done
Solution
Step 1: Check for loop syntax
Bash requires 'for variable in list; do ...; done'. The 'in' keyword is missing here.Step 2: Identify the error cause
Without 'in', Bash cannot parse the list, causing a syntax error.Final Answer:
Missing 'in' keyword after 'for item' -> Option DQuick Check:
For loop needs 'in' keyword = B [OK]
- Forgetting the 'in' keyword
- Adding unnecessary semicolons inside list
- Misnaming variables with invalid characters
fruits="apple banana cherry blueberry" for fruit in $fruits; do # Fill condition here echo "$fruit" done
Which condition inside the loop correctly filters fruits starting with 'b'?
Solution
Step 1: Understand string pattern matching in Bash
Double brackets [[ ]] support pattern matching with == and wildcards like '*'.Step 2: Check each condition
A uses [[ $fruit == b* ]] which matches strings starting with 'b'. B uses single brackets for exact 'b' match. C uses [[ $fruit =~ b* ]]; b* regex matches zero or more 'b's (including none), so every string. D uses single brackets which don't support patterns or ==.Final Answer:
if [[ $fruit == b* ]]; then -> Option BQuick Check:
Use [[ var == pattern* ]] for prefix match = A [OK]
- Using single brackets with wildcard patterns
- Confusing regex =~ with == operator
- Comparing to exact string 'b' instead of prefix
Ready to prove it?
Pass the test and this pattern moves unknown
