5.2 KiB
Interactive Menu
Build interactive Bash menus. This guide shows you how to create a menu where users choose which actions to run, leveraging previously defined functions for server status checks:
- Memory usage
- CPU load
- TCP connections
- Kernel version
Here's the base script containing these functions:
#!/usr/bin/env bash
##
# Server status script:
# - Memory usage
# - CPU load
# - Number of TCP connections
# - Kernel version
##
server_name=$(hostname)
function memory_check() {
echo ""
echo "Memory usage on ${server_name}: "
free -h
echo ""
}
function cpu_check() {
echo ""
echo "CPU load on ${server_name}: "
echo ""
uptime
echo ""
}
function tcp_check() {
echo ""
echo "TCP connections on ${server_name}: "
echo ""
cat /proc/net/tcp | wc -l
echo ""
}
function kernel_check() {
echo ""
echo "Kernel version on ${server_name}: "
echo ""
uname -r
echo ""
}
function all_checks() {
memory_check
cpu_check
tcp_check
kernel_check
}
We'll now integrate this with a menu, allowing users to select a function to execute.
Add Color for Readability
Enhance your menu's readability with simple color functions. Add these variables and functions to your script:
##
# Color Variables
##
green='\e[32m'
blue='\e[34m'
red='\e[31m'
clear='\e[0m'
##
# Color Functions
##
ColorGreen(){
echo -ne $green$1$clear
}
ColorBlue(){
echo -ne $blue$1$clear
}
ColorRed(){
echo -ne $red$1$clear
}
Use them like: $(ColorBlue 'Your text').
Build the Interactive Menu
Create a menu function containing the display logic, user input, and a case statement for selection.
menu(){
echo -ne "
My Server Status Menu
$(ColorGreen '1)') Memory usage
$(ColorGreen '2)') CPU load
$(ColorGreen '3)') TCP connections
$(ColorGreen '4)') Kernel version
$(ColorGreen '5)') Check All
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
read -r a
case $a in
1) memory_check ; menu ;;
2) cpu_check ; menu ;;
3) tcp_check ; menu ;;
4) kernel_check ; menu ;;
5) all_checks ; menu ;;
0) exit 0 ;;
*) echo -e $(ColorRed 'Invalid option.') ; menu ;;
esac
}
Here's how it works:
- The
echo -neblock prints the menu options, applying colors. read -r acaptures user input into variablea.- The
casestatement executes the corresponding function. After each function,menuis called again to display the menu for another choice, creating a loop.exit 0handles the exit option.
Finally, call the menu function at the end of your script to start the interaction:
menu
Complete Script and Testing
Here's the entire script, menu.sh, combining all components:
#!/usr/bin/env bash
##
# BASH menu script that checks:
# - Memory usage
# - CPU load
# - Number of TCP connections
# - Kernel version
##
server_name=$(hostname)
function memory_check() {
echo ""
echo "Memory usage on ${server_name}: "
free -h
echo ""
}
function cpu_check() {
echo ""
echo "CPU load on ${server_name}: "
echo ""
uptime
echo ""
}
function tcp_check() {
echo ""
echo "TCP connections on ${server_name}: "
echo ""
cat /proc/net/tcp | wc -l
echo ""
}
function kernel_check() {
echo ""
echo "Kernel version on ${server_name}: "
echo ""
uname -r
echo ""
}
function all_checks() {
memory_check
cpu_check
tcp_check
kernel_check
}
##
# Color Variables
##
green='\e[32m'
blue='\e[34m'
red='\e[31m'
clear='\e[0m'
##
# Color Functions
##
ColorGreen(){
echo -ne $green$1$clear
}
ColorBlue(){
echo -ne $blue$1$clear
}
ColorRed(){
echo -ne $red$1$clear
}
menu(){
echo -ne "
My Server Status Menu
$(ColorGreen '1)') Memory usage
$(ColorGreen '2)') CPU load
$(ColorGreen '3)') TCP connections
$(ColorGreen '4)') Kernel version
$(ColorGreen '5)') Check All
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
read -r a
case $a in
1) memory_check ; menu ;;
2) cpu_check ; menu ;;
3) tcp_check ; menu ;;
4) kernel_check ; menu ;;
5) all_checks ; menu ;;
0) exit 0 ;;
*) echo -e $(ColorRed 'Invalid option.') ; menu ;;
esac
}
# Call the menu function
menu
Save this code as menu.sh:
touch menu.sh
Open menu.sh and paste the script. Save and close. Then, make it executable and run:
chmod +x menu.sh
./menu.sh
You'll see the colored menu, prompting for input. Select an option (e.g., 1 for memory check), and the corresponding information will display before the menu reappears, ready for another choice.
Conclusion
You've built an interactive Bash menu, allowing users to effortlessly navigate script functionalities. This enhances user experience for your automation tools.
{notice} This content was inspired by a piece by softwareshinobi on Dev Team Six.