Using functions in menus

InĀ Chapter 6, Iterating with Loops, we created the menu.sh file. Menus are great targets to use functions, as the case statement is maintained very simply with single-line entries, while the complexity can still be stored in each function. We should consider creating a function for each menu item. If we copy the previous $HOME/bin/menu.sh to $HOME/bin/menu2.sh, we can improve the functionality. The new menu should look like the following code:

#!/bin/bash 
# Author: @likegeeks 
# Web: likegeeks.com 
# Sample menu with functions 
# Last Edited: April 2018 
 
to_lower() { 
    input="$1" 
    output=$( echo $input | tr [A-Z] [a-z]) 
return $output 
} 
 
do_backup() { 
    tar -czvf $HOME/backup.tgz ${HOME}/bin 
} 
 
show_cal() { 
    if [ -x /usr/bin/ncal ] ; then 
      command="/usr/bin/ncal -w" 
    else 
      command="/usr/bin/cal" 
    fi 
    $command 
} 
 
while true 
do 
  clear 
  echo "Choose an item: a, b or c" 
  echo "a: Backup" 
  echo "b: Display Calendar" 
  echo "c: Exit" 
  read -sn1 
  REPLY=$(to_lower "$REPLY") 
  case "$REPLY" in 
    a) do_backup;; 
    b) show_cal;; 
    c) exit 0;; 
  esac 
  read -n1 -p "Press any key to continue" 
done 

As we can see, we still maintain the simplicity of the case statement; however, we can develop the script to add in more complexity through the functions. For example, when choosing option b for the calendar, we now check to see whether the ncal command is available. If it is, we use ncal and use the -w option to print the week number. We can see this in the following screenshot, where we have chosen to display the calendar and install ncal:

We can also not be concerned about the Caps Lock key as the to_lower function converts our selection to lowercase. Over time, it would be very easy to add additional elements to the functions, knowing that we only affect that single function.