Shell Programming - Case statement

Unix

In this tutorial we will learn about Case conditional statement in Shell Programming.

Similar to the if statement we use the case statement to make decisions and execute a block of code based on some match.

Case syntax

case word in
  pattern1)
    # block of code for pattern1
    ;;

  pattern2)
    # block of code for pattern2
    ;;

  *)
    # default block
    ;;
esac

Where, word is some value that is matched with the pattern1, pattern2 and so on.

If the word matches any pattern then the block of code belonging to that pattern is executed.

The ;; marks the end of the block and takes us out of the case.

The *) represents the default pattern. If no match is found then the code in the default pattern is executed.

The default pattern *) is optional and can be omitted.

The esac (reverse of case) marks the end of the case statement.

Example #1: Write a Shell Script to take integer value from user and print some message based on a match

In the following example we will print the number.

#!/bin/sh

# take a number from user
echo "Enter number:"
read num

case $num in
  1)
    echo "It's one!"
    ;;

  2)
    echo "It's two!"
    ;;

  3)
    echo "It's three!"
    ;;

  *)
    echo "It's something else!"
    ;;
esac

echo "End of script."

Output:

$ sh num.sh 
Enter number:
10
It's something else!
End of script.

$ sh num.sh 
Enter number:
2
It's two!
End of script.

Example #2: Write a Shell Script to display greetings

In the following example we will take user name and time of the day as input and display some greetings message.

#!/bin/sh

# take user name
echo "Enter your name:"
read name

# take time of the day
echo "Enter time of the day [Morning/Afternoon/Evening/Night]:"
read daytime

case $daytime in
  "Morning")
    echo "Good Morning $name"
    ;;

  "Afternoon")
    echo "Good Afternoon $name"
    ;;

  "Evening")
    echo "Good Evening $name"
    ;;

  "Night")
    echo "Good Night $name"
    ;;
esac

echo "End of script."

Output:

$ sh greetings.sh 
Enter your name:
Yusuf Shakeel
Enter time of the day [Morning/Afternoon/Evening/Night]:
Morning
Good Morning Yusuf Shakeel
End of script.


$ sh greetings.sh 
Enter your name:
Yusuf Shakeel
Enter time of the day [Morning/Afternoon/Evening/Night]:

End of script.

In the second run we don't get any greetings message because the time of the day was not provided and the default pattern *) is not present in the case statement to handle such scenario.

So, we can modify the above code to handle such scenario by including the *) default pattern.

#!/bin/sh

# take user name
echo "Enter your name:"
read name

# take time of the day
echo "Enter time of the day [Morning/Afternoon/Evening/Night]:"
read daytime

case $daytime in
  "Morning")
    echo "Good Morning $name"
    ;;

  "Afternoon")
    echo "Good Afternoon $name"
    ;;

  "Evening")
    echo "Good Evening $name"
    ;;
    
  "Night")
    echo "Good Night $name"
    ;;

  *)
    echo "Time of the day missing!"
    ;;
esac

echo "End of script."

Output:

$ sh greetings-1.sh 
Enter your name:
Yusuf Shakeel
Enter time of the day [Morning/Afternoon/Evening/Night]:

Time of the day missing!
End of script.