Bash case Statement
The case Statement
The case statement checks one value against several patterns, and runs the code for the first pattern that matches.
It is a cleaner way to write a long chain of if...elif...else statements.
Syntax
Each pattern ends with ), and each block ends with ;;. The statement ends with esac ("case" spelled backwards):
case value in
pattern1)
commands
;;
pattern2)
commands
;;
esac
A Simple Example
Example: Check a Fruit
Save this as fruit.sh:
#!/bin/bash
fruit=$1
case $fruit in
apple)
echo "Apples are red or green."
;;
banana)
echo "Bananas are yellow."
;;
*)
echo "I don't know that fruit."
;;
esac
Run it:
./fruit.sh banana
Bananas are yellow.
The script gets the fruit from its first argument ($1). The *) pattern matches anything, so it works like else: it runs when no other pattern matched.
Several Patterns for One Block
Separate patterns with | to run the same code for any of them:
Example: Weekday or Weekend
Save this as day.sh:
#!/bin/bash
case $1 in
Mon|Tue|Wed|Thu|Fri)
echo "Weekday"
;;
Sat|Sun)
echo "Weekend"
;;
*)
echo "Not a day"
;;
esac
Run it:
./day.sh Sat
Weekend
Wildcard Patterns
Patterns can use wildcards: * matches any characters, ? matches one character, and [...] matches one of the listed characters.
Example: Check a File Type
Save this as filetype.sh:
#!/bin/bash
case $1 in
*.jpg|*.png)
echo "Image file"
;;
*.txt)
echo "Text file"
;;
*)
echo "Other file"
;;
esac
Run it:
./filetype.sh photo.jpg
Image file
Example: Yes or No
Save this as answer.sh:
#!/bin/bash
case $1 in
[Yy]|[Yy]es)
echo "You said yes"
;;
[Nn]|[Nn]o)
echo "You said no"
;;
esac
Run it:
./answer.sh Y
You said yes
case in a Menu
case is often used for simple menus, where the user's choice decides what happens:
Example: A Simple Menu
Save this as menu.sh:
#!/bin/bash
choice=$1
case $choice in
1) echo "Starting..." ;;
2) echo "Stopping..." ;;
3) echo "Restarting..." ;;
*) echo "Choose 1, 2 or 3" ;;
esac
Run it:
./menu.sh 2
Stopping...
Short blocks can be written on one line, with ;; at the end.