Logical operators (-a, -o, !) in Bash Scripting - Time & Space Complexity
We want to see how the time it takes to run a bash script with logical operators changes as input conditions grow.
How does combining conditions with -a, -o, and ! affect the script's speed?
Analyze the time complexity of the following code snippet.
count=0
while [ $count -lt $n ]; do
if [ -f "file$count.txt" -a ! -s "file$count.txt" ]; then
echo "Empty file: file$count.txt"
fi
count=$((count + 1))
done
This script checks files named file0.txt to file(n-1).txt to see if they exist and are empty.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The while loop runs the test on each file.
- How many times: It runs once for each file from 0 to n-1, so n times.
Each new file adds one more check with two conditions combined by logical operators.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks of two conditions each |
| 100 | About 100 checks of two conditions each |
| 1000 | About 1000 checks of two conditions each |
Pattern observation: The total checks grow directly with the number of files.
Time Complexity: O(n)
This means the time to run grows in a straight line as the number of files increases.
[X] Wrong: "Using -a and -o makes the script run much slower because it checks many conditions inside each loop."
[OK] Correct: Each condition check is simple and happens once per loop. The total time still grows linearly with the number of files, not exponentially.
Understanding how logical operators affect script speed helps you write efficient checks in real scripts, a useful skill in many automation tasks.
"What if we replaced the while loop with nested loops checking pairs of files? How would the time complexity change?"
Practice
[ ]?Solution
Step 1: Understand bash logical operators inside [ ]
Inside single brackets,-ameans AND,-omeans OR, and!means NOT.Step 2: Identify the AND operator
The operator-ais used to combine two conditions with AND logic.Final Answer:
-a -> Option DQuick Check:
AND operator = -a [OK]
- Confusing -a with -o
- Using && inside [ ] which is invalid
- Thinking ! means AND
file.txt exists AND is readable in bash?Solution
Step 1: Understand the condition to check
We want to check iffile.txtexists AND is readable, so both conditions must be true.Step 2: Choose correct logical operator and syntax
Inside [ ],-ameans AND, so[ -e file.txt -a -r file.txt ]is correct. Using-omeans OR, which is wrong here. Using&&inside [ ] is invalid syntax.Final Answer:
[ -e file.txt -a -r file.txt ] -> Option CQuick Check:
AND check uses -a inside [ ] [OK]
- Using -o instead of -a for AND
- Using && inside [ ] which causes syntax error
- Negating conditions incorrectly with !
if [ -f myfile.txt -o ! -r myfile.txt ]; then echo "Check passed"; else echo "Check failed"; fi
Assuming
myfile.txt exists but is NOT readable.Solution
Step 1: Analyze conditions with given file state
-f myfile.txtis true because file exists.! -r myfile.txtis true because file is not readable.Step 2: Evaluate OR (-o) logic
Since OR means either condition true passes, and both are true here, the whole condition is true.Final Answer:
Check passed -> Option AQuick Check:
True OR True = True [OK]
- Thinking ! -r means readable
- Confusing -o with -a
- Expecting syntax error due to !
if [ !-f myfile.txt -a -r myfile.txt ]; then echo "Valid"; fi
Solution
Step 1: Check spacing around ! operator
In bash,!must have a space after it inside [ ]. The code[ ! -f myfile.txt -a -r myfile.txt ]is correct only if spaces are present. If missing, it causes error.Step 2: Confirm other syntax parts
The use of-ainside [ ] is valid. The closing bracket is present. So no error there.Final Answer:
Missing spaces around ! operator -> Option AQuick Check:
! needs spaces inside [ ] [OK]
- Using && or || inside [ ]
- Forgetting spaces around operators
- Assuming -a is invalid inside [ ]
var is NOT empty AND file1.txt exists OR file2.txt is readable. Which condition is correct?Solution
Step 1: Understand the logic to implement
We want: var NOT empty AND file1 exists OR file2 readable, i.e., (NOT empty AND file1 exists) OR file2 readable.Step 2: Check each option's logic and syntax
A: Parentheses for grouping invalid inside [ ], syntax error.
B: [ -n "$var" -o -e file1.txt -a -r file2.txt ] wrong logic: mixes OR then AND.
C: [ -z "$var" -a -e file1.txt -o -r file2.txt ] uses -z (empty), wrong for NOT empty.
D: [ -n "$var" -a -e file1.txt -o -r file2.txt ] correct: left-to-right ((non-empty -a exists) -o readable).Final Answer:
[ -n "$var" -a -e file1.txt -o -r file2.txt ] -> Option BQuick Check:
-a/-o left-to-right no grouping needed [OK]
- Trying to group with ( ) invalid in [ ]
- Mixing -o and -a without understanding associativity
- Using -z for non-empty check
Ready to prove it?
Pass the test and this pattern moves unknown
