多年来, shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时,就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。
9.1 创建文本菜单
创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户了解脚本能做什么和不能做什么。通常菜单脚本会清空显示区域,然后显示可用的选项列表。用户可以按下与每个选项关联的字母或数字来选择选项。shell脚本菜单的核心是case命令。 case命令会根据用户在菜单上的选择来执行特定命令。
9.1.1 创建菜单布局
创建菜单的第一步显然是决定在菜单上显示哪些元素以及想要显示的布局方式。在创建菜单前,通常要先清空显示器上已有的内容。这样就能在干净的、没有干扰的环境中显示菜单了。clear命令用当前终端会话的terminfo数据来清理出现在屏幕上的文本。运行clear命令之后,可以用echo命令来显示菜单元素。默认情况下, echo命令只显示可打印文本字符。在创建菜单项时,非可打印字符通常也很有用,比如制表符和换行符。要在echo命令中包含这些字符,必须用-e选项。因此,命令如下:
[root@kittod ~]# echo -e "1.\tDisplay disk space"
1. Display disk space
![]()
这极大地方便了菜单项布局的格式化。只需要几个echo命令,就能创建一个看上去还行的菜单。
[root@kittod ~]# cat menu01.sh
#!/bin/bash
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\tEnter option: "


最后一行的-en选项会去掉末尾的换行符。这让菜单看上去更专业一些,光标会一直在行尾等待用户的输入。
创建菜单的最后一步是获取用户输入。这步用read命令。因为我们期望只有单字符输入,所以在read命令中用了-n选项来限制只读取一个字符。这样用户只需要输入一个数字,也不用按回车键:
[root@kittod ~]# cat menu01.sh
#!/bin/bash
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\tEnter option: "
read -n 1 option
[root@kittod ~]# bash menu01.sh
Sys Admin Menu
1. Display disk space
2. Display logged on users
3. Display memory usage
0. Exit menu
Enter option:


接下来,你需要创建自己的菜单函数。
9.1.2 创建菜单函数
shell脚本菜单选项作为一组独立的函数实现起来更为容易。这样你就能创建出简洁、准确、容易理解的case命令。
要做到这一点,你要为每个菜单选项创建独立的shell函数。创建shell菜单脚本的第一步是决定你希望脚本执行哪些功能,然后将这些功能以函数的形式放在代码中。
[root@kittod ~]# cat menu02.sh
#!/bin.bash
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\tEnter option:"
read -n 1 option
}
menu


这样一来,任何时候你都能调用menu函数来重现菜单。
9.1.3 添加菜单逻辑
现在你已经建好了菜单布局和函数,只需要创建程序逻辑将二者结合起来就行了。前面提到过,这需要用到case命令。case命令应该根据菜单中输入的字符来调用相应的函数。用默认的case命令字符(星号)来处理所有不正确的菜单项是种不错的做法。
下面的代码展示了典型菜单中case命令的用法。
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection" ;;
esac

这段代码首先用menu函数清空屏幕并显示菜单。 menu函数中的read命令会一直等待,直到用户在键盘上键入了字符。然后, case命令就会接管余下的处理过程。 case命令会基于返回的字符调用相应的函数。在函数运行结束后, case命令退出。
9.1.4 整合 shell 脚本菜单
现在已经看到了构成shell脚本菜单的各个部分,让我们将它们组合在一起,看看彼此之间是如何协作的。这里是一

最低0.47元/天 解锁文章
158

被折叠的 条评论
为什么被折叠?



