创建菜单布局
echo -e选项可以输出制表符和换行符
echo -en选项会去掉末尾换行符,这样光标会一直在行尾等待用户输入。
然后使用read -n 1 option限制只读取第一个字符
[root@tzPC 18Unit]# cat test1.sh #!/bin/bash clear echo echo -e " tSys Admin Menu " echo -e " 1. Display disk space" echo -e " 2. Display logged on users" echo -e " 3. Display memory usage" echo -e " 0. Exit menu " echo -en " Enter option:" read -n 1 option
这样菜单布局运行的结果是
创建菜单函数
为每个菜单选项都创建独立的函数。
可以为还没有实现功能的函数创建一个桩函数,说明这个函数的用途。
function diskspace { clear echo "This is where the diskspace commands will go" }
可以将菜单布局本身写入函数
function menu { clear echo echo -e " tSys Admin Menu " echo -e " 1. Display disk space" echo -e " 2. Display logged on users" echo -e " 3. Display memory usage" echo -e " 0. Exit menu " echo -en " Enter option:" read -n 1 option }
添加菜单逻辑
使用case命令处理命令行参数
menu #先打印菜单布局 case $option in 0) break ;; 1) diskpace ;; 2) whoseon ;; 3) memusage ;; *) clear echo "Sorry, wrong selection" ;; esac
组后将各个部分整合成一个脚本
[root@tzPC 18Unit]# cat test1.sh #!/bin/bash #simple script menu function diskspace { clear df -k } function whoseon { clear who } function memusage { clear cat /proc/meminfo } function menu { clear echo echo -e " tSys Admin Menu " echo -e " 1. Display disk space" echo -e " 2. Display logged on users" echo -e " 3. Display memory usage" echo -e " 0. Exit menu " echo -en " Enter option:" read -n 1 option } while [ 1 ] #一直循环菜单 do menu #使用menu函数打印菜单 case $option in 0) break ;; 1) diskspace ;; 2) whoseon ;; 3) memusage ;; *) clear echo "Sorry, wrong selection" ;; esac echo -en " Hit any key to continue" read -n 1 line done clear
这个脚本很炫,可以自己写一下试一下。
使用select命令写菜单布局
语法格式
select variable in list do commands done
lis参数是由空格分隔的文本选项列表,select会将每个列表前加上一个编号。
将上面的脚本略微改动
[root@tzPC 18Unit]# cat test2.sh #!/bin/bash #simple script 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" do case $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
注意上面的PS3变量
PS3 是Prompt String 3的缩写,它是Linux/Unix下的一个用于控制select命令创建的菜单提示信息的环境变量,如果不写那么提示语句的位置会变成?符号
制作窗口
dialog包可以创建标准的窗口对话框。
dialog命令使用命令行参数来决定生成哪种窗口部件。
dialog部件参数在书P384,太多我不想打,哈哈,不懂的要学会自己找man~
语法格式
dialog --widget parameters
其中widget为部件名
parameters定义窗口的大小以及部件需要的文本
每个部件输出方式
- 使用STDERR文件描述符
- 使用退出状态码
通过dialog命令的退出状态码确定用户选择的按钮
dialog命令的退出状态码为0,说明用户选择了yes按钮
退出状态码为1,用户选择的no按钮
状态码值可用$?变量确定
部件返回的数据会发送到STDERR文件描述符可通过重定向到文件或者其他文件描述符获知
[root@tzPC 18Unit]# dialog --inputbox "Enter your age:" 10 20 2> age.txt
可以重定向到文件看到值20,并且没有换行符
[root@tzPC 18Unit]# cat age.txt 20[root@tzPC 18Unit]#
msgbox部件
在窗口显示一条消息,点击OK才会消失
语法格式
dialog --msgbox text height width
--title参数在窗口顶部写一个标题
[root@tzPC 18Unit]# dialog --title Testing --msgbox "This is a test" 10 20
yesno部件
扩展了msgbox部件的功能,多了yes跟no按钮
[root@tzPC 18Unit]# dialog --title "Please answer" --yesno "Is this thing on?" 10 20
此时如果选择了yes退出码就为0,选择no退出码为1
[root@tzPC 18Unit]# echo $? 0
inputbox部件
多一个文本框用来输入文本,输入的文本会发送给STDERR,需要重定向才能获取文本框里的值。
上面的例子写过。
textbox部件
显示大量信息,会生成一个滚动的窗口显示由参数所指定的文件
[root@tzPC 18Unit]# dialog --textbox /etc/passwd 15 45
menu部件
创建文本菜单窗口
[root@tzPC 18Unit]# dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk spac" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2>test.txt
--menu:定义菜单的标题
20:高
30:宽
10:窗口中一次显示菜单项的总数
这里书中有误,dialog命令会将选定的菜单项的标号发送到STDERR
fselect部件
浏览文件位置并选择文件
[root@tzPC 18Unit]# dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt
fselect选项后的第一个参数是窗口中使用的起始目录位置,fselect部件窗口左侧文本框里显示的目录列表,右侧文本框里显示的是该目录下的文件列表,可以在底部的文本框中手动输入文件名或者目录使用空格选定。
注意:鼠标点击没用。
最后重定向到file.txt的值为底部文本框内的值。
dialog选项
除了部件,dialog命令还支持很多选项,P390,太多了我不写,略略略。
其中--backtitle选项给把标题写在脚本背景左上角上,看起来更专业点。
[root@tzPC 18Unit]# dialog --backtitle "Select a file" --fselect $HOME/ 10 50 2>file.txt
在脚本中使用dialog命令
记住使用dialog命令需要检查两样东西
- 由yes/no按钮需要检查退出状态码
- 重定向STDERR来获得输出值
[root@tzPC 18Unit]# cat menu3.sh #!/bin/bash #using dialog to create a menu temp=$(mktemp -t test.XXXXXX) temp2=$(mktemp -t test2.XXXXXX) function diskspace { df -k > $temp dialog --texbox $temp 20 60 } function whoseon { who > $temp dialog --textbox $temp 20 50 } function memusage { cat /proc/meminfo > $temp dialog --textbox $temp 20 50 } while [ 1 ] do dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2>$temp2 if [ $? -eq 1 ];then break fi selection=$(cat $temp2) case $selection in 1)diskspace ;; 2)whoseon ;; 3)memusage ;; 0)break ;; *)dialog --msgbox "Sorry, invalid selection" 10 30 esac done rm -rf $temp 2>/dev/null rm -rf $temp2 2>/dev/null
脚本效果很炫酷,值得一试!
其他桌面版图形化编程
KDE环境
默认包含kdialog包,使用kdialog命令在KDE桌面生成类似dialog部件窗口。
这个作为了解,实际生产环境中不会安装图形化界面。
P393
GNOME环境
支持两种可生成标准窗口的包
- gdialog
- zenity
P396
学习来自:《Linux命令行与Shell脚本大全 第3版》第18章