使用字符打印的菜单界面实现交互。
创建文本菜单
通常菜单脚本会清空显示区域、显示可用选项列表、识别用户选择,这就意味着文本菜单的核心是 case 命令。
创建菜单布局
clear 命令可用于当前终端会话的 terminfo 数据来清理出现在屏幕上的文本。
echo 默认只显示可打印字符,-e 选项能够使其显示制表符,-en 选项能够去掉末尾的换行符。
function menu {
clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit menu\n\n"
echo -en "\t\t Enter option: "
}
创建菜单的最后一步是获取用户输入,这步用 read 命令,在 read 命令中使用 -n 选项来限制只读取一个字符。这样用户只需要输入一个数字,也不用按回车键:
read -n 1 option
创建菜单函数
我们需要为每个菜单选项提供独立的 shell 函数。创建 shell 菜单脚本的第一步就是决定你希望脚本执行哪些功能,然后将这些功能以函数的形式放在代码中。
为还没实现功能的函数创建一个桩函数,可以是一个空函数,也可以是具有 echo 语句的函数。
function diskspace {
clear
echo "This is where the diskspace commands will go."
}
添加菜单逻辑
使用 case 命令:
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection" ;;
esac
整合 shell 脚本菜单
#!/bin/bash
#...
function diskspace {
clear
df -k
}
function whoseon {
clear
cat /proc/meminfo
}
function memusage {
clear
cat /proc/meminfo
}
function menu {
clear
echo
echo -e "\t\t\tSys Admin Menu\n"
echo -e "\t1. Display disk space"
echo -e "\t2. Display logged on users"
echo -e "\t3. Display memory usage"
echo -e "\t0. Exit menu\n\n"
echo -en "\t\t Enter option: "
}
while [ 1 ]
do
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection" ;;
esac
echo -en "\n\n\t\t\tHit any key to continue"
read -n 1 line
done
clear
使用 select 命令
使用 select 快速创建出菜单,然后获取输入的答案并自动处理。
select variable in list
do
commands
done
list:由空格分隔的文本选项列表,这些列表构成了整个菜单,select 命令会将每个列表项显示成一个带编号的选项,然后为选项显示一个由PS3环境变量定义的特殊提示符。
#!/bin/bash
# ...
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusage {
clear
cat /proc/meminfo
}
PS3="Enter options: "
select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program"
do
case $option in
"Exit program")
break ;;
"Display disk space")
whoseon ;;
"Display memory usage")
memusage ;;
*)
clear
echo "Sorry, wrong selection" ;;
esac
done
clear