Bird
Raised Fist0
Bash Scriptingscripting~5 mins

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

Choose your learning style10 modes available
Introduction
Logical operators help you combine or reverse conditions in scripts to make decisions.
Check if two files both exist before running a command.
Run a command if either one of two conditions is true.
Skip a step if a certain condition is not met.
Combine multiple checks in an if statement for better control.
Syntax
Bash Scripting
if [ condition1 -a condition2 ]; then
  # commands
fi

if [ condition1 -o condition2 ]; then
  # commands
fi

if [ ! condition ]; then
  # commands
fi
Use -a for AND (both conditions must be true).
Use -o for OR (at least one condition must be true).
Use ! to negate (reverse) a condition.
Examples
Checks if both file1.txt and file2.txt exist.
Bash Scripting
if [ -f file1.txt -a -f file2.txt ]; then
  echo "Both files exist"
fi
Checks if either /tmp or /var directory exists.
Bash Scripting
if [ -d /tmp -o -d /var ]; then
  echo "At least one directory exists"
fi
Checks if missing.txt does NOT exist.
Bash Scripting
if [ ! -f missing.txt ]; then
  echo "missing.txt does not exist"
fi
Sample Program
This script checks if two files exist using logical operators. It creates file1.txt only, then tests conditions with -a, -o, and !.
Bash Scripting
#!/bin/bash

file1="file1.txt"
file2="file2.txt"

# Create only file1.txt for this example
touch "$file1"

if [ -f "$file1" -a -f "$file2" ]; then
  echo "Both files exist"
elif [ -f "$file1" -o -f "$file2" ]; then
  echo "Only one file exists"
else
  echo "No files exist"
fi

if [ ! -f "$file2" ]; then
  echo "$file2 does not exist"
fi
OutputSuccess
Important Notes
Always put spaces around [ and ] and between conditions and operators.
For complex conditions, consider using [[ ... ]] with && and || for better readability.
Logical operators inside [ ] are less flexible than in [[ ]], but still widely used.
Summary
Logical operators combine conditions to control script flow.
-a means AND, -o means OR, and ! means NOT.
Use them inside [ ] to test multiple conditions simply.

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