String comparisons (=, !=, -z, -n) in Bash Scripting - Time & Space Complexity
When we compare strings in bash scripts, it is useful to know how the time taken grows as the strings get longer.
We want to understand how the cost of comparing strings changes with their size.
Analyze the time complexity of the following code snippet.
str1="$1"
str2="$2"
if [ "$str1" = "$str2" ]; then
echo "Strings are equal"
else
echo "Strings are different"
fi
if [ -z "$str1" ]; then
echo "First string is empty"
fi
This script compares two strings for equality and checks if the first string is empty.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Comparing characters of two strings one by one.
- How many times: Up to the length of the shorter string, character by character.
As the strings get longer, the comparison checks more characters until it finds a difference or reaches the end.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to 10 character comparisons |
| 100 | Up to 100 character comparisons |
| 1000 | Up to 1000 character comparisons |
Pattern observation: The number of operations grows roughly in direct proportion to the string length.
Time Complexity: O(n)
This means the time to compare strings grows linearly with the length of the strings.
[X] Wrong: "String comparisons always take the same time no matter how long the strings are."
[OK] Correct: The comparison checks characters one by one, so longer strings usually take more time.
Understanding how string comparison time grows helps you write efficient scripts and answer questions about performance clearly.
What if we used pattern matching instead of direct string comparison? How would the time complexity change?
Practice
Solution
Step 1: Understand string equality operator
In bash,=inside [[ ]] compares if two strings are equal.Step 2: Differentiate from other operators
-zchecks if string is empty,!=checks inequality,-nchecks non-empty string.Final Answer:
Using=inside double brackets [[ ]] -> Option AQuick Check:
String equality = = [OK]
- Confusing = with -z or -n
- Using = outside [[ ]] without quotes
- Mixing != with = for equality
var is not empty in bash?Solution
Step 1: Understand -n operator
-nreturns true if the string length is greater than zero (not empty).Step 2: Check syntax correctness
Using quotes around$varprevents errors if variable is empty or contains spaces.Final Answer:
[ -n "$var" ] -> Option CQuick Check:
Not empty check = -n [OK]
- Using -z instead of -n for not empty
- Forgetting quotes around variable
- Using = "" to check emptiness incorrectly
var="hello" if [[ "$var" != "world" ]]; then echo "Not world" else echo "World" fi
Solution
Step 1: Evaluate string comparison
Variablevaris "hello", which is not equal to "world".Step 2: Determine which branch runs
The condition[[ "$var" != "world" ]]is true, so it echoes "Not world".Final Answer:
Not world -> Option AQuick Check:
hello != world -> Not world [OK]
- Confusing = and != operators
- Missing quotes causing syntax errors
- Assuming else branch runs when condition is true
input is empty:
if [ -z $input ]; then echo "Empty" else echo "Not empty" fi
Solution
Step 1: Check variable quoting in test
Variable$inputis not quoted, which can cause errors if empty or contains spaces.Step 2: Understand correct syntax
Quotes around$inputlike"$input"are needed to safely test emptiness.Final Answer:
Missing quotes around $input in test -> Option BQuick Check:
Always quote variables in tests [OK]
- Forgetting quotes around variables
- Thinking -z and -n are interchangeable
- Believing single brackets can't test strings
text is empty, and "Has content" otherwise. Which snippet correctly does this?Solution
Step 1: Understand -z usage
-z "$text"returns true iftextis empty.Step 2: Check echo outputs match condition
If empty, print "Empty string"; else print "Has content". if [[ -z "$text" ]]; then echo "Empty string"; else echo "Has content"; fi matches this logic correctly.Final Answer:
if [[ -z "$text" ]]; then echo "Empty string"; else echo "Has content"; fi -> Option DQuick Check:
-z empty -> print "Empty string" [OK]
- Swapping outputs for empty and non-empty cases
- Using = "" without quotes or wrong logic
- Confusing -n and -z meanings
Ready to prove it?
Pass the test and this pattern moves unknown
