NANDHOO.

Chapter 7: Conditionals

Scripting is not just about running commands in a line; it is about making decisions based on data. In the shell, "truth" is determined by Exit Codes. A successful command returns 0, which the shell interprets as True.

I. The Test Command: [ vs [[

There are two ways to write conditions in Bash. Understanding the difference is crucial for writing robust scripts.

1. The Old Test: [ ... ]

This is actually a command (usually /usr/bin/[). It is highly compatible but has limitations:

  • Requires quoting variables to handle spaces.
  • Cannot use && or || inside the brackets.

2. The New Test: [[ ... ]]

This is a Bash keyword (not a command). It is preferred for all modern Bash scripts:

  • Handles spaces in variables automatically (less quoting needed).
  • Supports Pattern Matching and Regex.
  • Allows && and || inside the brackets.

II. Decision Flow Logic

COMMANDEXIT 0?YESIF BLOCKNOELSE BLOCK

III. Common Test Operators

1. String Tests

  • [[ $A == $B ]]: True if strings are equal.
  • [[ $A != $B ]]: True if strings are NOT equal.
  • [[ -z $A ]]: True if string is empty.
  • [[ $A =~ ^[0-9]+$ ]]: True if string matches a Regex (digits only).

2. File Tests

  • [[ -f $FILE ]]: Is it a regular file?
  • [[ -d $DIR ]]: Is it a directory?
  • [[ -e $NAME ]]: Does it exist at all?
  • [[ -s $FILE ]]: Is the file not empty?

IV. Multi-Branch Logic: case

When you have many possible values for a single variable, an if-elif-else chain becomes messy. The case statement is much cleaner.

#!/usr/bin/env bash

read -p "Enter extension (mp3, jpg, txt): " EXT

case "$EXT" in
    mp3)
        echo "Processing audio..."
        ;;
    jpg|jpeg|png)
        echo "Processing image..."
        ;;
    txt|md)
        echo "Processing text..."
        ;;
    *)
        echo "Unknown format!"
        exit 1
        ;;
esac

V. Arithmetic Context: (( ... ))

For numeric comparisons, use double parentheses. This allows you to use standard mathematical operators like >, <, >=, and ==.

SCORE=85
if (( SCORE >= 90 )); then
    echo "Grade: A"
elif (( SCORE >= 80 )); then
    echo "Grade: B"
else
    echo "Keep trying!"
fi

In the next chapter, we'll learn how to repeat tasks efficiently using Loops.