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.