Bash Case Statements - Pattern Matching Switch

Learn bash case statements for pattern matching control flow. Covers basic patterns, wildcards, OR patterns, and practical examples for argument parsing and menus.

Control Flow

Detailed Explanation

Case Statements in Bash

The case statement provides pattern-matching similar to a switch statement. It is cleaner than multiple if/elif chains when matching a variable against several patterns.

Basic Syntax

case "$variable" in
  pattern1)
    commands
    ;;
  pattern2)
    commands
    ;;
  *)
    default commands
    ;;
esac

Service Control Script

#!/usr/bin/env bash
case "$1" in
  start)
    echo "Starting service..."
    ./bin/server --daemon
    ;;
  stop)
    echo "Stopping service..."
    kill $(cat /var/run/app.pid)
    ;;
  restart)
    $0 stop
    sleep 2
    $0 start
    ;;
  status)
    if [ -f /var/run/app.pid ] && kill -0 $(cat /var/run/app.pid) 2>/dev/null; then
      echo "Running (PID: $(cat /var/run/app.pid))"
    else
      echo "Stopped"
    fi
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
    ;;
esac

Pattern Matching Features

# OR patterns
case "$input" in
  yes|y|Y)
    echo "Confirmed"
    ;;
  no|n|N)
    echo "Cancelled"
    ;;
esac

# Wildcards
case "$filename" in
  *.tar.gz|*.tgz)
    tar -xzf "$filename"
    ;;
  *.zip)
    unzip "$filename"
    ;;
  *.deb)
    dpkg -i "$filename"
    ;;
  *)
    echo "Unknown file type"
    ;;
esac

# Character ranges
case "$char" in
  [a-z]) echo "Lowercase letter" ;;
  [A-Z]) echo "Uppercase letter" ;;
  [0-9]) echo "Digit" ;;
  *)     echo "Special character" ;;
esac

Argument Parsing

while [[ $# -gt 0 ]]; do
  case "$1" in
    -h|--help)
      usage
      exit 0
      ;;
    -v|--verbose)
      VERBOSE=true
      shift
      ;;
    -o|--output)
      OUTPUT="$2"
      shift 2
      ;;
    --)
      shift
      break
      ;;
    -*)
      echo "Unknown option: $1" >&2
      exit 1
      ;;
    *)
      ARGS+=("$1")
      shift
      ;;
  esac
done

Use Case

Case statements are ideal for service init scripts (start/stop/restart), command-line argument parsing, file type detection based on extension, interactive menu systems, and any scenario where you need to match a value against multiple patterns. They are more readable and maintainable than long if/elif chains.

Try It — Bash Cheat Sheet

Open full tool