📖 Scenario: You work in a small company where you need to check if user input matches certain patterns. You want to automate this check using a Bash script.
🎯 Goal: Build a Bash script that uses the [[ ]] test with the =~ operator to check if a string matches a regular expression pattern.
📋 What You'll Learn
Create a variable with a specific string value
Create a regex pattern variable to match a pattern
Use the [[ ]] test with =~ to check if the string matches the regex
Print a message showing if the string matches or not
💡 Why This Matters
🌍 Real World
Checking if user input or file names match expected patterns is common in scripts that automate tasks like validation or filtering.
💼 Career
Many IT and DevOps roles require writing Bash scripts that validate data formats using regex to automate system checks and data processing.
Progress0 / 4 steps
1
Create a string variable
Create a variable called input_string and set it to the exact value "hello123".
Bash Scripting
Hint
Use variable_name="value" syntax to create a string variable in Bash.
2
Create a regex pattern variable
Create a variable called pattern and set it to the regex ^[a-z]+[0-9]+$ which matches strings starting with letters followed by numbers.
Bash Scripting
Hint
Use single quotes to store the regex pattern as a string in Bash.
3
Use [[ ]] with =~ to test the regex
Write an if statement using [[ $input_string =~ $pattern ]] to check if input_string matches pattern. Inside the if, set a variable result to "Match", else set result to "No match".
Bash Scripting
Hint
Use if [[ $var =~ $regex ]]; then ... else ... fi syntax in Bash.
4
Print the result
Write a echo command to print the value of the result variable.
Bash Scripting
Hint
Use echo "$result" to print the variable's value.
Practice
(1/5)
1. What does the expression [[ "hello123" =~ [a-z]+[0-9]+ ]] check in a bash script?
easy
A. If the string is exactly 'hello123'
B. If the string contains letters followed by numbers
C. If the string contains only numbers
D. If the string starts with a number
Solution
Step 1: Understand the regex pattern
The pattern [a-z]+[0-9]+ means one or more lowercase letters followed by one or more digits.
Step 2: Apply the pattern to the string
The string "hello123" starts with letters "hello" and ends with digits "123", so it matches the pattern.
Final Answer:
If the string contains letters followed by numbers -> Option B
Quick Check:
Regex matches letters then digits = A [OK]
Hint: Look for letter-digit sequence in string with regex [OK]
Common Mistakes:
Thinking quotes are needed around regex inside [[ ]]
Confusing exact match with pattern match
Assuming regex matches anywhere without order
2. Which of the following is the correct syntax to test if variable var matches regex ^[0-9]+$ in bash?
easy
A. [[ $var =~ "^[0-9]+$" ]]
B. [[ "$var" =~^[0-9]+$ ]]
C. [[ $var =~ ^[0-9]+$ ]]
D. [[ "$var" =~ "^[0-9]+$" ]]
Solution
Step 1: Recall regex syntax in [[ ]]
Inside [[ ]], the regex pattern should NOT be quoted to work correctly.
Step 2: Check each option
[[ $var =~ ^[0-9]+$ ]] uses [[ $var =~ ^[0-9]+$ ]] without quotes around regex, which is correct syntax.
Final Answer:
[[ $var =~ ^[0-9]+$ ]] -> Option C
Quick Check:
No quotes around regex pattern = B [OK]
Hint: Do not quote regex pattern inside [[ ]] [OK]
Common Mistakes:
Putting quotes around regex pattern causing syntax errors
Quoting variable but not regex or vice versa
Using single brackets [ ] instead of [[ ]]
3. What will be the output of this bash script snippet?
text="abc123"
if [[ $text =~ ^[a-z]+[0-9]+$ ]]; then
echo "Match"
else
echo "No match"
fi
medium
A. Match
B. No match
C. Syntax error
D. Empty output
Solution
Step 1: Analyze the regex pattern
The pattern ^[a-z]+[0-9]+$ means the string must start with one or more lowercase letters and end with one or more digits, with nothing else.
Step 2: Check the string against the pattern
The string "abc123" starts with letters "abc" and ends with digits "123", so it matches the pattern exactly.
Final Answer:
Match -> Option A
Quick Check:
String matches regex pattern = D [OK]
Hint: Check start ^ and end $ anchors carefully [OK]
Common Mistakes:
Ignoring anchors ^ and $ in regex
Assuming partial match is enough
Quoting regex pattern causing failure
4. Identify the error in this bash snippet:
input="2023-04-01"
if [[ "$input" =~ "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" ]]; then
echo "Valid date"
else
echo "Invalid date"
fi
medium
A. Quotes around regex cause the match to fail
B. Variable input is not quoted
C. Regex pattern is invalid syntax
D. Missing semicolon after if condition
Solution
Step 1: Check quoting rules for regex in [[ ]]
Regex pattern inside [[ ]] with =~ must NOT be quoted; quotes make it a string literal, breaking regex matching.
Step 2: Identify the error in the snippet
The snippet quotes the regex pattern, causing the condition to always fail and print "Invalid date".
Final Answer:
Quotes around regex cause the match to fail -> Option A
Quick Check:
No quotes around regex pattern = C [OK]
Hint: Never quote regex pattern inside [[ ]] [OK]
Common Mistakes:
Quoting regex pattern inside [[ ]]
Forgetting to quote variable when needed
Assuming regex syntax errors without checking quotes
5. You want to check if a variable filename ends with either ".jpg" or ".png" using regex in bash. Which condition correctly tests this?
hard
A. [[ "$filename" =~ "\.(jpg|png)$" ]]
B. [[ $filename =~ "\.(jpg|png)$" ]]
C. [[ "$filename" =~\.(jpg|png)$ ]]
D. [[ $filename =~ \.(jpg|png)$ ]]
Solution
Step 1: Understand regex for file extensions
The pattern \.(jpg|png)$ matches a dot followed by 'jpg' or 'png' at the end of the string.
Step 2: Apply correct quoting rules
Regex pattern must NOT be quoted inside [[ ]], and variable can be unquoted if it has no spaces. [[ $filename =~ \.(jpg|png)$ ]] correctly uses unquoted regex and variable.
Final Answer:
[[ $filename =~ \.(jpg|png)$ ]] -> Option D
Quick Check:
Unquoted regex with alternation = A [OK]
Hint: Use unquoted regex with alternation inside [[ ]] [OK]
Common Mistakes:
Quoting regex pattern causing failure
Not escaping dot before extension
Quoting variable unnecessarily
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.