Создание интерактивного меню в Bash
В этом уроке я покажу вам, как создать в Bash меню с множественным выбором, чтобы ваши пользователи могли выбирать, какое действие следует выполнить!
Мы бы повторно использовали часть кода из предыдущей главы, поэтому, если вы еще не прочитали ее, обязательно сделайте это.
Планирование функциональности
Начнем еще раз с рассмотрения основного функционала скрипта:
Проверяет текущее использование диска
Проверяет текущую загрузку процессора
Проверяет текущее использование оперативной памяти
Проверяет, проверяет точную версию ядра
Если у вас его нет под рукой, вот сам скрипт:
#!/bin/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} is: "
free -h
echo ""
}
function cpu_check() {
echo ""
echo "CPU load on ${server_name} is: "
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} is: "
echo ""
uname -r
echo ""
}
function all_checks() {
memory_check
cpu_check
tcp_check
kernel_check
}
Затем мы создадим меню, которое позволит пользователю выбирать, какую функцию выполнять.
Конечно, вы можете настроить функции или добавить новые в зависимости от ваших потребностей.
Добавляем немного цветов
Чтобы сделать меню более «читабельным» и понятным на первый взгляд, мы добавим несколько цветовых функций.
В начале вашего скрипта добавьте следующие функции цвета:
##
# Color Variables
##
green='\e[32m'
blue='\e[34m'
clear='\e[0m'
##
# Color Functions
##
ColorGreen(){
echo -ne $green$1$clear
}
ColorBlue(){
echo -ne $blue$1$clear
}
Вы можете использовать функции цвета следующим образом:
echo -ne $(ColorBlue 'Some text here')
Вышеупомянутое выведет Some text here
строку, и она будет синей!
Добавление меню
Наконец, чтобы добавить наше меню, мы создадим отдельную функцию с переключением регистра для пунктов меню:
menu(){
echo -ne "
My First Menu
$(ColorGreen '1)') Memory usage
$(ColorGreen '2)') CPU load
$(ColorGreen '3)') Number of TCP connections
$(ColorGreen '4)') Kernel version
$(ColorGreen '5)') Check All
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
read 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 $red"Wrong option."$clear; WrongCommand;;
esac
}
Краткое изложение кода
Сначала мы просто выделяем пункты меню некоторым цветом:
echo -ne "
My First Menu
$(ColorGreen '1)') Memory usage
$(ColorGreen '2)') CPU load
$(ColorGreen '3)') Number of TCP connections
$(ColorGreen '4)') Kernel version
$(ColorGreen '5)') Check All
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
Затем мы читаем ответ пользователя и сохраняем его в переменной с именем $a
:
read a
Наконец, у нас есть случай переключения, который запускает разные функции в зависимости от значения $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 $red"Wrong option."$clear; WrongCommand;;
esac
В конце нам нужно вызвать функцию меню, чтобы распечатать меню:
# Call the menu function
menu
Тестирование скрипта
В конечном итоге ваш скрипт будет выглядеть так:
#!/bin/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} is: "
free -h
echo ""
}
function cpu_check() {
echo ""
echo "CPU load on ${server_name} is: "
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} is: "
echo ""
uname -r
echo ""
}
function all_checks() {
memory_check
cpu_check
tcp_check
kernel_check
}
##
# Color Variables
##
green='\e[32m'
blue='\e[34m'
clear='\e[0m'
##
# Color Functions
##
ColorGreen(){
echo -ne $green$1$clear
}
ColorBlue(){
echo -ne $blue$1$clear
}
menu(){
echo -ne "
My First Menu
$(ColorGreen '1)') Memory usage
$(ColorGreen '2)') CPU load
$(ColorGreen '3)') Number of TCP connections
$(ColorGreen '4)') Kernel version
$(ColorGreen '5)') Check All
$(ColorGreen '0)') Exit
$(ColorBlue 'Choose an option:') "
read 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 $red"Wrong option."$clear; WrongCommand;;
esac
}
# Call the menu function
menu
Чтобы протестировать скрипт, создайте новый файл с .sh
расширением, например: menu.sh
и затем запустите его:
bash menu.sh
Результат, который вы получите, будет выглядеть так:
My First Menu
1) Memory usage
2) CPU load
3) Number of TCP connections
4) Kernel version
5) Check All
0) Exit
Choose an option:
Вы сможете выбрать другой вариант из списка, и каждый номер будет вызывать отдельную функцию из скрипта:
Заключение
Теперь вы знаете, как создать меню Bash и реализовать его в своих скриптах, чтобы пользователи могли выбирать разные значения!
Last updated