Bird
Raised Fist0
Bash Scriptingscripting~5 mins

Regex in [[ ]] with =~ in Bash Scripting - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does the operator =~ do inside [[ ]] in bash?
The =~ operator tests if the string on the left matches the regular expression on the right inside [[ ]]. It returns true if it matches, false otherwise.
Click to reveal answer
beginner
How do you write a regex match to check if a variable contains only digits using [[ ]] and =~?
Use: [[ $var =~ ^[0-9]+$ ]] which means the variable contains one or more digits from start (^) to end ($).
Click to reveal answer
intermediate
What happens if you put the regex in quotes when using =~ inside [[ ]]?
If the regex is quoted, it is treated as a fixed string, not a regex. This usually breaks the pattern matching. So, do NOT quote the regex.
Click to reveal answer
intermediate
How can you access the part of the string matched by the regex after using =~?
Bash stores the matched groups in the array variable BASH_REMATCH. BASH_REMATCH[0] is the full match, BASH_REMATCH[1] the first group, and so on.
Click to reveal answer
beginner
Why use [[ ]] with =~ instead of [ ] with grep or test?
[[ ]] with =~ is faster and simpler for regex matching inside bash scripts. It avoids spawning external commands like grep, making scripts more efficient.
Click to reveal answer
In bash, what does [[ $var =~ ^abc ]] check?
AIf $var equals 'abc'
BIf $var starts with 'abc'
CIf $var ends with 'abc'
DIf $var contains 'abc' anywhere
What is stored in BASH_REMATCH[1] after a successful [[ $var =~ (pattern) ]] match?
AThe variable name
BThe full matched string
CThe first captured group
DThe regex pattern
Which is correct to check if $var contains only letters using regex in [[ ]]?
A[[ $var =~ "^[a-zA-Z]+$" ]]
B[[ $var =~ '[a-zA-Z]+' ]]
C[[ $var == ^[a-zA-Z]+$ ]]
D[[ $var =~ ^[a-zA-Z]+$ ]]
What does [[ $var =~ [0-9]{3} ]] return if $var='abc123def'?
ATrue, because '123' matches three digits
BFalse, because $var is not only digits
CError, regex is invalid
DFalse, because regex must be quoted
Why avoid quoting the regex in [[ $var =~ regex ]]?
AQuoting disables regex matching and treats it as a string
BQuoting makes the script run faster
CQuoting is required for special characters
DQuoting changes the variable value
Explain how to use regex matching inside [[ ]] with =~ in bash scripts.
Think about how bash tests patterns without external tools.
You got /4 concepts.
    Describe common mistakes when using =~ with regex in bash and how to avoid them.
    Focus on syntax and quoting rules.
    You got /4 concepts.

      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

      1. Step 1: Understand the regex pattern

        The pattern [a-z]+[0-9]+ means one or more lowercase letters followed by one or more digits.
      2. 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.
      3. Final Answer:

        If the string contains letters followed by numbers -> Option B
      4. 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

      1. Step 1: Recall regex syntax in [[ ]]

        Inside [[ ]], the regex pattern should NOT be quoted to work correctly.
      2. Step 2: Check each option

        [[ $var =~ ^[0-9]+$ ]] uses [[ $var =~ ^[0-9]+$ ]] without quotes around regex, which is correct syntax.
      3. Final Answer:

        [[ $var =~ ^[0-9]+$ ]] -> Option C
      4. 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

      1. 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.
      2. 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.
      3. Final Answer:

        Match -> Option A
      4. 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

      1. 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.
      2. Step 2: Identify the error in the snippet

        The snippet quotes the regex pattern, causing the condition to always fail and print "Invalid date".
      3. Final Answer:

        Quotes around regex cause the match to fail -> Option A
      4. 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

      1. 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.
      2. 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.
      3. Final Answer:

        [[ $filename =~ \.(jpg|png)$ ]] -> Option D
      4. 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 unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard