Bird
Raised Fist0
Bash Scriptingscripting~10 mins

[[ ]] extended test in Bash Scripting - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - [[ ]] extended test
Start
↓
Evaluate [[ expression
↓
Is expression true?
No→Execute else or skip
Yes↓
Execute then block
↓
End
The [[ ]] extended test evaluates a condition. If true, it runs the then block; if false, it runs else or skips.
Execution Sample
Bash Scripting
if [[ -f /etc/passwd && -r /etc/passwd ]]; then
  echo "File exists and is readable"
else
  echo "File missing or not readable"
fi
Checks if /etc/passwd exists and is readable, then prints a message accordingly.
Execution Table
StepExpression EvaluatedResultBranch TakenOutput
1-f /etc/passwdtrueContinue
2-r /etc/passwdtrueContinue
3-f /etc/passwd && -r /etc/passwdtrueThen blockFile exists and is readable
4End of ifN/AExit
💡 Both conditions true, so then block executed and if statement ends.
Variable Tracker
VariableStartAfter Step 1After Step 2Final
-f /etc/passwdN/Atruetruetrue
-r /etc/passwdN/AN/Atruetrue
Combined expressionN/AN/AN/Atrue
Key Moments - 2 Insights
Why do we use [[ ]] instead of [ ] for extended tests?
Because [[ ]] supports more complex expressions like &&, ||, and pattern matching, as shown in steps 1-3 of the execution_table.
What happens if one condition in && is false?
The combined expression becomes false and the else block runs or the if is skipped, as the logical AND requires both true (see exit_note).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the result of the expression '-r /etc/passwd' at step 2?
Aerror
Bfalse
Ctrue
Dnot evaluated
💡 Hint
Check the 'Result' column in row for step 2 in execution_table.
At which step does the script decide to execute the then block?
AStep 3
BStep 1
CStep 2
DStep 4
💡 Hint
Look at the 'Branch Taken' column to see when 'Then block' is chosen.
If the file /etc/passwd was not readable, how would the combined expression result change?
AIt would be true
BIt would be false
CIt would cause an error
DIt would be skipped
💡 Hint
Recall that && requires both conditions true; see key_moments about false condition effect.
Concept Snapshot
[[ ]] extended test syntax:
if [[ condition ]]; then
  commands
fi

Supports complex tests with &&, ||, pattern matching.
Returns true or false to control flow.
Use for safer, more powerful condition checks.
Full Transcript
This example shows how the bash [[ ]] extended test works. The script checks if the file /etc/passwd exists and is readable using two conditions combined with && inside [[ ]]. Step 1 tests if the file exists (-f), which is true. Step 2 tests if the file is readable (-r), also true. Step 3 combines both with &&, resulting in true, so the then block runs and prints 'File exists and is readable'. If either condition was false, the else block would run or the if would skip. The [[ ]] syntax allows combining tests safely and clearly. This trace helps beginners see each step's result and understand how the condition controls the script flow.

Practice

(1/5)
1. What does the [[ ]] construct do in a bash script?
easy
A. It tests conditions like comparing strings or numbers.
B. It defines a function in bash.
C. It creates a new variable.
D. It runs a command in the background.

Solution

  1. Step 1: Understand the purpose of [[ ]]

    The [[ ]] syntax is used in bash to test conditions such as string comparison, number comparison, and file checks.
  2. Step 2: Compare with other options

    Options B, C, and D describe other bash features unrelated to [[ ]].
  3. Final Answer:

    It tests conditions like comparing strings or numbers. -> Option A
  4. Quick Check:

    [[ ]] = condition test [OK]
Hint: Remember: [[ ]] is for testing conditions in bash [OK]
Common Mistakes:
  • Confusing [[ ]] with function definition syntax
  • Thinking [[ ]] creates variables
  • Assuming [[ ]] runs commands
2. Which of the following is the correct syntax to check if variable var equals "hello" using [[ ]]?
easy
A. [[ $var != "hello" ]]
B. [[ $var == "hello" ]]
C. [[ $var === "hello" ]]
D. [[ $var -eq "hello" ]]

Solution

  1. Step 1: Identify correct string comparison operator in [[ ]]

    In bash, inside [[ ]], the operator for string equality is ==. -eq is for numeric equality. === is invalid.
  2. Step 2: Check each option

    [[ $var != "hello" ]] checks inequality. [[ $var -eq "hello" ]] uses numeric -eq on string (error). [[ $var === "hello" ]] uses invalid ===. [[ $var == "hello" ]] uses == correctly.
  3. Final Answer:

    [[ $var == "hello" ]] -> Option B
  4. Quick Check:

    String equality in [[ ]] uses == [OK]
Hint: Use == for string equality inside [[ ]] [OK]
Common Mistakes:
  • Using === which is invalid in bash
  • Using -eq for string comparison
  • Using != when checking for equality
3. What will be the output of this script snippet?
var=5
if [[ $var -gt 3 && $var -lt 10 ]]; then
echo "In range"
else
echo "Out of range"
fi
medium
A. In range
B. Out of range
C. Syntax error
D. No output

Solution

  1. Step 1: Evaluate numeric conditions inside [[ ]]

    The variable var is 5. The condition checks if 5 is greater than 3 and less than 10, which is true.
  2. Step 2: Determine which branch runs

    Since the condition is true, the script echoes "In range".
  3. Final Answer:

    In range -> Option A
  4. Quick Check:

    5 > 3 and 5 < 10 = true [OK]
Hint: Check each numeric condition carefully with && [OK]
Common Mistakes:
  • Confusing -gt and -lt operators
  • Using single & instead of &&
  • Forgetting to quote variables (not critical here)
4. Identify the error in this bash snippet:
filename="test.txt"
if [[ -f $filename && -r $filename ]]
then
echo "File exists and readable"
fi
medium
A. Variable $filename not quoted
B. Wrong operator for file check
C. Missing closing bracket "]" for [[ ]]
D. Missing then keyword

Solution

  1. Step 1: Check syntax of [[ ]] condition

    The condition starts with [[ and has matching closing ]]. So brackets are correct.
  2. Step 2: Verify other parts

    The then keyword is missing after the condition line, which causes a syntax error.
  3. Final Answer:

    Missing then keyword -> Option D
  4. Quick Check:

    Every if condition must be followed by then [OK]
Hint: Always include then after if condition [OK]
Common Mistakes:
  • Forgetting the then keyword
  • Using single [ with && without escaping
  • Ignoring variable quoting warnings
5. You want to check if a variable input is either "yes" or "y" (case insensitive) using [[ ]]. Which snippet correctly does this?
hard
A. [[ $input =~ ^(yes|y)$ ]]
B. [[ $input == "yes" || $input == "y" ]]
C. [[ ${input,,} == "yes" || ${input,,} == "y" ]]
D. [[ $input == "yes" && $input == "y" ]]

Solution

  1. Step 1: Understand case-insensitive check

    To ignore case, convert input to lowercase using ${input,,} before comparison.
  2. Step 2: Check logical OR condition

    We want to accept either "yes" or "y", so use || between comparisons.
  3. Step 3: Evaluate options

    [[ ${input,,} == "yes" || ${input,,} == "y" ]] correctly converts to lowercase and uses OR. [[ $input == "yes" || $input == "y" ]] lacks case conversion. [[ $input =~ ^(yes|y)$ ]] uses regex but is case-sensitive. [[ $input == "yes" && $input == "y" ]] uses AND which requires both to be true, impossible here.
  4. Final Answer:

    [[ ${input,,} == "yes" || ${input,,} == "y" ]] -> Option C
  5. Quick Check:

    Use ${var,,} for lowercase and || for OR [OK]
Hint: Use ${var,,} to lowercase and || for OR in [[ ]] [OK]
Common Mistakes:
  • Not converting input to lowercase
  • Using && instead of || for alternatives
  • Incorrect regex syntax inside [[ ]]
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