Bird
Raised Fist0
Bash Scriptingscripting~10 mins

Logical operators (-a, -o, !) in Bash Scripting - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Logical operators (-a, -o, !)
Start
↓
Evaluate first condition
↓
Apply -a (AND) or -o (OR) operator
↓
If ! operator present, negate result
↓
Final result: True or False
↓
End
The script checks conditions, combines them with AND (-a) or OR (-o), and can negate the result with !.
Execution Sample
Bash Scripting
if [ "$x" -gt 5 -a "$y" -lt 10 ]; then
  echo "Both conditions true"
fi
Checks if x is greater than 5 AND y is less than 10, then prints a message.
Execution Table
StepCondition CheckedEvaluationOperatorCombined ResultNegation (!)Final ResultAction
1"$x" -gt 5True (x=7)-a
2"$y" -lt 10True (y=8)-aTrue AND True = TrueTrueExecute echo
3ExitNo more conditionsEnd if
💡 All conditions evaluated; combined result True; no negation; action executed.
Variable Tracker
VariableStartAfter Step 1After Step 2Final
x7777
y8888
Combined ResultN/AN/ATrueTrue
Key Moments - 2 Insights
Why do we use -a instead of && inside [ ]?
Inside [ ], -a is used for AND because && is a shell operator outside test brackets. See execution_table rows 1 and 2 where -a combines conditions.
What does the ! operator do in conditions?
The ! operator negates the condition result. If the combined result is True, ! makes it False, and vice versa. This happens after combining conditions, as shown in concept_flow.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table at Step 2, what is the combined result of the conditions?
AFalse
BTrue
CUndefined
DError
💡 Hint
Check the Combined Result column in Step 2 of execution_table.
At which step does the script decide to execute the echo command?
AStep 2
BStep 3
CStep 1
DNo echo executed
💡 Hint
Look at the Action column in execution_table rows.
If we add ! before the whole condition, what would be the final result given x=7 and y=8?
ATrue
BError
CFalse
DDepends on shell
💡 Hint
Refer to concept_flow and key_moments about negation.
Concept Snapshot
Logical operators in bash test [ ]:
-a means AND (both conditions true)
-o means OR (either condition true)
! negates the condition
Use -a and -o inside [ ], not && or ||
Negation applies after combining conditions
Full Transcript
This visual trace shows how bash logical operators -a (AND), -o (OR), and ! (NOT) work inside test brackets [ ]. The script checks each condition step-by-step, combines them with -a or -o, then optionally negates the result with !. Variables x and y are checked against numeric conditions. The combined result determines if the action inside if runs. Key points include using -a and -o inside [ ] instead of shell operators, and that ! negates the final combined result. The execution table tracks each step, condition evaluation, and final decision.

Practice

(1/5)
1. Which logical operator in bash scripting means AND when used inside [ ]?
easy
A. &&
B. -o
C. !
D. -a

Solution

  1. Step 1: Understand bash logical operators inside [ ]

    Inside single brackets, -a means AND, -o means OR, and ! means NOT.
  2. Step 2: Identify the AND operator

    The operator -a is used to combine two conditions with AND logic.
  3. Final Answer:

    -a -> Option D
  4. Quick Check:

    AND operator = -a [OK]
Hint: Remember: -a is AND, -o is OR, ! is NOT inside [ ] [OK]
Common Mistakes:
  • Confusing -a with -o
  • Using && inside [ ] which is invalid
  • Thinking ! means AND
2. Which of the following is the correct syntax to check if file file.txt exists AND is readable in bash?
easy
A. [ -e file.txt -o -r file.txt ]
B. [ -e file.txt && -r file.txt ]
C. [ -e file.txt -a -r file.txt ]
D. [ ! -e file.txt -a -r file.txt ]

Solution

  1. Step 1: Understand the condition to check

    We want to check if file.txt exists AND is readable, so both conditions must be true.
  2. Step 2: Choose correct logical operator and syntax

    Inside [ ], -a means AND, so [ -e file.txt -a -r file.txt ] is correct. Using -o means OR, which is wrong here. Using && inside [ ] is invalid syntax.
  3. Final Answer:

    [ -e file.txt -a -r file.txt ] -> Option C
  4. Quick Check:

    AND check uses -a inside [ ] [OK]
Hint: Use -a for AND inside [ ], not && or -o for AND [OK]
Common Mistakes:
  • Using -o instead of -a for AND
  • Using && inside [ ] which causes syntax error
  • Negating conditions incorrectly with !
3. What will be the output of this script snippet?
if [ -f myfile.txt -o ! -r myfile.txt ]; then echo "Check passed"; else echo "Check failed"; fi

Assuming myfile.txt exists but is NOT readable.
medium
A. Check passed
B. Check failed
C. Syntax error
D. No output

Solution

  1. Step 1: Analyze conditions with given file state

    -f myfile.txt is true because file exists. ! -r myfile.txt is true because file is not readable.
  2. Step 2: Evaluate OR (-o) logic

    Since OR means either condition true passes, and both are true here, the whole condition is true.
  3. Final Answer:

    Check passed -> Option A
  4. Quick Check:

    True OR True = True [OK]
Hint: OR (-o) passes if any condition is true [OK]
Common Mistakes:
  • Thinking ! -r means readable
  • Confusing -o with -a
  • Expecting syntax error due to !
4. Identify the error in this bash condition:
if [ !-f myfile.txt -a -r myfile.txt ]; then echo "Valid"; fi
medium
A. Missing spaces around ! operator
B. Incorrect use of -a inside [ ]
C. No error, condition is correct
D. Missing closing bracket ]

Solution

  1. Step 1: Check spacing around ! operator

    In bash, ! must have a space after it inside [ ]. The code [ ! -f myfile.txt -a -r myfile.txt ] is correct only if spaces are present. If missing, it causes error.
  2. Step 2: Confirm other syntax parts

    The use of -a inside [ ] is valid. The closing bracket is present. So no error there.
  3. Final Answer:

    Missing spaces around ! operator -> Option A
  4. Quick Check:

    ! needs spaces inside [ ] [OK]
Hint: Always put spaces around ! inside [ ] [OK]
Common Mistakes:
  • Using && or || inside [ ]
  • Forgetting spaces around operators
  • Assuming -a is invalid inside [ ]
5. You want to write a bash condition that checks if a variable var is NOT empty AND file1.txt exists OR file2.txt is readable. Which condition is correct?
hard
A. [ -n "$var" -a ( -e file1.txt -o -r file2.txt ) ]
B. [ -n "$var" -a -e file1.txt -o -r file2.txt ]
C. [ -z "$var" -a -e file1.txt -o -r file2.txt ]
D. [ -n "$var" -o -e file1.txt -a -r file2.txt ]

Solution

  1. Step 1: Understand the logic to implement

    We want: var NOT empty AND file1 exists OR file2 readable, i.e., (NOT empty AND file1 exists) OR file2 readable.
  2. Step 2: Check each option's logic and syntax

    A: Parentheses for grouping invalid inside [ ], syntax error.
    B: [ -n "$var" -o -e file1.txt -a -r file2.txt ] wrong logic: mixes OR then AND.
    C: [ -z "$var" -a -e file1.txt -o -r file2.txt ] uses -z (empty), wrong for NOT empty.
    D: [ -n "$var" -a -e file1.txt -o -r file2.txt ] correct: left-to-right ((non-empty -a exists) -o readable).
  3. Final Answer:

    [ -n "$var" -a -e file1.txt -o -r file2.txt ] -> Option B
  4. Quick Check:

    -a/-o left-to-right no grouping needed [OK]
Hint: -a/-o associate left-to-right inside [ ] [OK]
Common Mistakes:
  • Trying to group with ( ) invalid in [ ]
  • Mixing -o and -a without understanding associativity
  • Using -z for non-empty check
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