本文将和大家一起学习集中可以增加交互式脚本活力的方法,使得shell脚本看上去不是那么单调乏味,使其看上去更符合潮流。
创建文本菜单
①创建菜单脚本的小技巧
要在echo命令中包含字符(例如制表符和换行符),必须使用-e选项。
echo -en将显示该行,而不再行为添加换行符。
在read命令中使用-n选项仅获取一个字符,这样允许用户输入一个数字而不必再按回车。
②简单的例子
一下例子实现了一个简单的获取linux系统管理信息。
funcation diskpace {
clear
df -k
}
funcation whoseon{
clear
who
}
funcation memusage{
clear
cat /proc/meninfo
}
funcation 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 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 "Error!!"
esac
echo -en "\n\n\t\t\tHit any key to continue"
read -n 1 line
done
clear
③使用select命令
在shell中我们可以使用select命令,来更便利的创建菜单选项,其语法规则如下:
select variable in list
do
commands
done
参数列表使用空格隔开的构建菜单的文本项列表,然后选择一个特殊提示符,由PS3环境变量定义。
我们将上面那个例子使用select进行改写:
funcation diskpace {
clear
df -k
}
funcation whoseon{
clear
who
}
funcation memusage{
clear
cat /proc/meninfo
}
PS3="Enter option: "
select option in "Display disk space" "Display logged on users" "Display memory usage" "Enter option"
do
case $option in
"Enter option")
break;;
"Display disk space")
diskspace;;
"Display logged on users")
whoseon;;
"Display memory usage")
memusage;;
*)
clear
echo "Error!!"
esac
done
clear
使用select命令时,要记住:存储在变量中的结果值是整个文本字符串,而不是与该菜单项关联的数字。文本字符串才是case语句中比较的内容。
添加颜色
①ANSI转义码
要控制显示格式,必须使用选择图形再现转义码。SGE转义码的格式为:
CSIn[;k]m
效果控制代码从0~8
颜色控制代码从0~7,其中设置前景颜色使用3开头的一个两位数,第二位为所需要的颜色代码,设置背景颜色使用4开头的两位数,同样第二位数字表示具体颜色。
代码 | 描述 | 代码 | 描述 |
---|---|---|---|
0 | 黑色 | 4 | 蓝色 |
1 | 红色 | 5 | 洋红色 |
2 | 绿色 | 6 | 青色 |
3 | 黄色 | 7 | 白色 |
②显示ANSI转义码
使用Ctrl-v组合件,后跟Esc建,字符^[出现。
例如:
$ echo ^[[41mThis is a test^[[00m #输出后恢复原来的颜色方案
$ echo "^[[33;41mThis is a test^[[00m" #使用两个转移控制时,用双引号引起来
制作窗口
①初识dialog
使用dialog软件包可以很方便地将对话框合并到shell脚本中来与脚本用户进行交互。
命令格式:
dialog --widget parameters
其中widget为下表的小部件名称,parameters为定义的窗口不见大小。
小部件 | 描述 |
---|---|
calendar | 日历 |
inputbox | 文本输入框 |
menu | 显示一系列可供选择的选项 |
msgbox | 显示消息 |
texbox | 在滚动的窗口中显示文件中的文本 |
yesno | 提供一个含有Yes/No按钮的简单消息 |
… | … |
小提示:可以使用--title "标题内容" 来显示小窗口的标题信息
举个例子:
dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 0 "Exit" 2>$test
关于dialog的用法各种资料中写的十分详细,在这里只是做一个简单的认识,就不再赘述了。
②在脚本中使用dialog命令
需要遵循两点:
★如果Cancel或者No按钮可用,请检查dialog命令的退出状态。
★重定向STDERR以获取输出值。
③获取图形
我们还可以使用kdialog和zenity软件包,它们分别为KDE和GNOME桌面提供图形化的窗口小部件。其操作与dialog有部分类似,在这就不再赘述,特别注意的是kdialog和zenity将标签值发送到STDOUT中,而dialog将标签值发送到STDERR中。