shell 脚本菜单项作为一组独立的函数实现起来更为容易。这样你就能创建出简洁、准确且容
易理解的 case 命令了。
为此,你要为每个菜单项创建单独的 shell 函数。创建 shell 菜单脚本的第一步是确定脚本要
实现的功能,然后将这些功能以函数的形式放在代码中。
通常我们会为还没有实现的函数创建一个桩函数(stub function)。桩函数既可以是一个空函
数,也可以只包含一个 echo 语句,用于说明最终这里需要什么内容:
function diskspace {
clear
echo"This is where the diskspace commands will go"}
这个桩函数允许在实现某个函数的同时,菜单仍能正常操作。无须等到写出所有函数之后才
让菜单投入使用。你会注意到,函数从 clear 命令开始。这是为了能在一个干净的屏幕上执行
函数,不让它受到原先菜单的干扰。
菜单布局函数
将菜单布局本身作为一个函数来创建,有助于制作 shell 脚本菜单:
function menu {
clear
echoecho-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 program\n\n"echo-en "\t\tEnter option: "
read -n 1 option
}
这样,任何时候你都能调用 menu 函数来重现菜单。
添加菜单逻辑
case命令
现在你已经创建好了菜单布局和 menu 函数,只需创建程序逻辑将二者结合起来即可。前面
提到过,这要用到 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 命令退出。
整合 shell 脚本菜单
# 现在你已经看到了组成 shell 脚本菜单的各个部分,让我们将它们整合在一起,看看它们彼# 此之间是如何协作的。下面是一个完整的菜单脚本示例:# $ cat menu.sh#!/bin/bash # simple script menu function diskspace {
clear
df -k
}function whoseon {
clear
who
}function memusage {
clear
cat /proc/meminfo
}function menu {
clear
echoecho-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 program\n\n"echo-en "\t\tEnter option: "
read -n 1 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
这个菜单创建了 3 个函数,以使用常见命令提取 Linux 系统的管理信息。while 循环用于持
续处理菜单,除非用户选择了选项 0,即通过 break 命令跳出 while 循环。
可以用这个模板创建任何 shell 脚本的菜单界面。它提供了一种与用户交互的简单途径。
# $ cat menu1.sh#!/bin/bash # using select in the menu function diskspace {
clear
df -k
}function whoseon {
clear
who
}function memusage {
clear
cat /proc/meminfo
}PS3="Enter option: "
select option in "Display disk space""Display logged on users" \
"Display memory usage""Exit program"docase$option in
"Exit program")break;;"Display disk space")
diskspace ;;"Display logged on users")
whoseon ;;"Display memory usage")
memusage ;;*)
clear
echo"Sorry, wrong selection";;
esac
done
clear
select 语句中的所有内容必须作为一行出现。这从续行符就可以看出。运行该脚本会自动
生成如下菜单:
1) Display disk space
2) Display logged on users
3) Display memory usage
4)Exit program
Enter option:
在使用 select 命令时,存储在指定变量中的值是整个字符串,而不是跟菜单选项相
关联的数字。字符串才是要在 case 语句中进行比较的内容。