Bird
Raised Fist0
Bash Scriptingscripting~3 mins

Why [[ ]] extended test in Bash Scripting? - Purpose & Use Cases

Choose your learning style10 modes available
The Big Idea

Discover how a simple syntax change can save you from frustrating script errors!

The Scenario

Imagine you have a list of files and you want to check if each file exists and is not empty before processing it. Doing this manually means typing multiple commands for each file, checking conditions one by one.

The Problem

Manually checking each file is slow and easy to forget important checks. You might miss empty files or accidentally process non-existent ones, causing errors or wasted time.

The Solution

The [[ ]] extended test in bash lets you write clear, concise conditions to check files and other things in one place. It reduces mistakes and speeds up your scripts.

Before vs After
✗ Before
if [ -e file.txt ] && [ -s file.txt ]; then echo 'File is ready'; fi
✓ After
if [[ -e file.txt && -s file.txt ]]; then echo 'File is ready'; fi
What It Enables

You can write safer, cleaner scripts that handle complex checks easily and avoid common errors.

Real Life Example

When backing up important documents, you can use [[ ]] to ensure only existing and non-empty files get copied, preventing backup failures.

Key Takeaways

Manual checks are slow and error-prone.

[[ ]] lets you combine tests cleanly.

This makes scripts safer and easier to read.

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