《Linux命令行与shell脚本编程大全》 第十七章 学习笔记
第一部分:Linux命令行
《Linux命令行与shell脚本编程大全》 第一章:初识Linux shell
《Linux命令行与shell脚本编程大全》 第二章:走进shell
《Linux命令行与shell脚本编程大全》 第三章:基本的bash shell命令
《Linux命令行与shell脚本编程大全》 第四章:更多的bash shell命令
《Linux命令行与shell脚本编程大全》 第五章:使用Linux环境变量
《Linux命令行与shell脚本编程大全》 第六章:理解Linux文件权限
《Linux命令行与shell脚本编程大全》 第七章:管理文件系统
《Linux命令行与shell脚本编程大全》 第八章:安装软件程序
《Linux命令行与shell脚本编程大全》 第九章:使用编辑器
第二部分:shell脚本编程基础
《Linux命令行与shell脚本编程大全》 第十章:构建基本脚本
《Linux命令行与shell脚本编程大全》 第十一章:使用结构化命令
《Linux命令行与shell脚本编程大全》 第十二章:更多的结构化命令
《Linux命令行与shell脚本编程大全》 第十三章:处理用户输入
《Linux命令行与shell脚本编程大全》 第十四章:呈现数据
《Linux命令行与shell脚本编程大全》 第十五章:控制脚本
第三部分:高级shell编程
《Linux命令行与shell脚本编程大全》 第十六章:创建函数
《Linux命令行与shell脚本编程大全》 第十七章:图形化桌面上的脚本编程
《Linux命令行与shell脚本编程大全》 第十八章:初识sed和gawk
《Linux命令行与shell脚本编程大全》 第十九章:正则表达式
《Linux命令行与shell脚本编程大全》 第二十章:sed进阶
《Linux命令行与shell脚本编程大全》 第二十一章:gawk进阶
《Linux命令行与shell脚本编程大全》 第二十二章:使用其他shell
第四部分:高级shell脚本编程主题
《Linux命令行与shell脚本编程大全》 第二十三章:使用数据库
《Linux命令行与shell脚本编程大全》 第二十四章:使用Web
《Linux命令行与shell脚本编程大全》 第二十五章:使用E-mail
《Linux命令行与shell脚本编程大全》 第二十六章:编写脚本实用工具
《Linux命令行与shell脚本编程大全》 第二十七章:shell脚本编程进阶
第十七章:图形化桌面上的脚本编程
创建文本菜单
创建菜单布局
#!/bin/bash clear #清屏 echo -e "\t\tMenu" echo -e "1.\tDisplay disk space" echo -e "2.\tDisplay logged on user" echo -e "3.\tDisplay memory usage" echo -e "0.\tExit menu\n\n" echo -en "\t\tEnter option:" #-n表示不打印回车 read -n1 option #读取一个字符 echo ""
显示效果:
Menu 1. Display disk space 2. Display logged on user 3. Display memory usage 0. Exit menu Enter option:
创建菜单函数
只需把上面的代码用函数包起来即可
添加菜单逻辑
#!/bin/bash option="" create_menu(){ clear echo -e "\t\tMenu" echo -e "1.\tDisplay disk space" echo -e "2.\tDisplay logged on user" echo -e "3.\tDisplay memory usage" echo -e "0.\tExit menu\n\n" echo -en "\t\tEnter option:" read -n1 option echo "" } create_menu case $option in 0) echo "Display disk space";; 1) echo "Display logged on user";; 2) echo "Display memory usage";; 3) echo "Exit menu";; *) echo "error";; esac
添加对应的case即可,之后,我们再来实现相应的函数。
整合shell脚本菜单
首先添加case相应的实现函数
disk_space(){ clear df -k } whoseon(){ clear who } menu_usage(){ clear cat /proc/meminfo }
之后处理case部分
deal_menu(){ case $option in 1) disk_space;; 2) whoseon;; 3) menu_usage;; 0) echo "Exit menu";; *) #输入错误,重新输入 echo -e "\nSorry, wrong selection." echo -en "\n\n\t\tHit any key to continue." read -n1 option #重新读取菜单选项 deal_menu;; esac } deal_menu
使用select命令
select命令允许从单个命令行创建菜单,然后再提取输入的答案并自动处理。
select variable in list do commands done
list参数是构成菜单的空格分割的文本选项列表。
select命令会在列表中将每个选项作为一个编好号的选项显示,然后为选项显示一个特殊的由PS3环境变量定义的提示符。(默认的提示符为#?)
PS3="Enter option:" select option in "Display disk space" "Display logged on user" "Display memory usage" "Exit menu" do case $option in "Display disk space") disk_space;; "Display logged on user") whoseon;; "Display memory usage") menu_usage;; "Exit menu") echo "Exit menu" break;; *) echo -e "\nSorry, wrong selection." echo -en "\n\n\t\tHit any key to continue." read -n1 option deal_menu;; esac done
运行结果:
$ menu_test 1) Display disk space 3) Display memory usage 2) Display logged on user 4) Exit menu Enter option:
select会自动生成菜单
注意:存储在变量中的结果是整个字符串,不是菜单选项前面的数字
使用窗口
安装dialog:sudo apt-get install dialog
dialog包
dialog部件
部件 | 描述 |
calendar | 提供选择日期的日历 |
checklist | 显示多个选项(其中每一个选项都能打开或关闭) |
from | 构建一个表单(用标签和文本字段来填充) |
fselect | 提供一个文件选择窗口来浏览选择文件 |
gauge | 显示完成的百分比进度条 |
infobox | 显示一条消息,但不用等待回应 |
inputbox | 提供一个输入文本用的文本表单 |
inputmenu | 提供一个可编辑的菜单 |
menu | 显示可选择的一些列选项 |
msgbox | 显示一条消息,并要求用户选择OK按钮 |
pause | 显示一个进度条来显示特定暂定时间的状态 |
passwordbox | 显示一个文本框来输入文本,但会隐藏输入的文本 |
passwordform | 显示一个带标签和隐藏文本输入的表单 |
radiolist | 提供一组菜单选项,但只能选择其中一个 |
tailbox | 用tail命令在滚动窗口中显示文件的内容 |
tailboxbg | 跟tailbox一样,但是在后台模式中运行 |
textbox | 在滚动窗口中显示文件的内容 |
timebox | 提供一个选择小时、分钟和秒数的窗口 |
yesno |
提供一条简单的带Yes和No按钮的消息 |
dialog --widget parameters
widget是上面的部件,parameters是部件窗口大小、所需文本等
每个dialog部件都提供两种格式的输出:
使用STDERR
使用退出状态码
用户选择的按钮决定了dialog命令的退出状态码。如果选择Yes、OK,dialog命令会返回退出状态码0。如果选择了Cancel、NO,dialog命令会返回退出状态码1
可以用标准的$?变量来查看退出状态码
如果部件返回了任何数据,那么dialog命令会将数据发送到STDERR
msgbox部件
dialog --msgbox text height width
可以指定title
dialog --title Testing --msgbox "This is a test" 10 20
yesno部件
dialog --title "Do not lie to me" --yesno "Are you a girl?" 10 20
inputbox部件
dialog --title "Do not lie to me" --inputbox "Enter you age:" 10 20 2>age.txt
textbox部件
dialog --textbox /etc/passwd 15 45
可以显示大量文本,并且可以用方向键、Home、End、PgUp、PgDn等操作
menu部件
dialog --menu "Menu" 20 30 5 1 "A." 2 "B." 3 "C."
上面红色的参数表示菜单栏的高度为5个item高,前面两个参数是dialog的高和宽
fselect部件
dialog --title "select a file" --fselect /etc/ 10 50 2>file.txt
dialog选项
选项 | 描述 |
--add-widget | 继续下个对话框,直到按下Esc或者Cancel |
--aspect ratio | 指定窗口宽度和高度的宽高比 |
--backtitle title | 指定显示在屏幕顶部背景上的标题(2) |
--begin x y | 指定窗口左上角的起始位置 |
--cancel-label label | 指定Cancel按钮的替代标签 |
--clear | 用默认对话背景色来清空显示 |
--colors | 在对话框文本中嵌入ANSI色彩编码 |
--cr-wrap | 在对话文本中允许使用换行符并强制换行 |
--create-rc file | 将示例配置文件的内容复制到指定的file文件中(1) |
--defaultno | 将yes/no对话的默认答案设置为no |
--default-item string | 设定复选列表,表单或菜单对话中的默认项 |
--exit-label label | 指定Exit按钮的替代标签 |
--extra-button | 在OK按钮和Cancel按钮中显示一个额外按钮 |
--extra-label label | 指定额外按钮的替代标签 |
--help | 显示dialog命令的帮助信息 |
--help-button | 在OK按钮和Cancel按钮后显示一个Help按钮 |
--help-label label | 指定Help按钮的替代标签 |
--help-status | 当选定Help按钮时,会在帮助信息后写入多选列表、单选列表或表单信息 |
--ignore | 忽略dialog不能识别的选项 |
--input-fd fd | 指定另一个文件描述符,而不是STDIN |
--insecure | 在password部件中键入时显示星号 |
--item-help | 为多选列表,单选列表或菜单中的每个标号在屏幕的底部添加一个帮助栏 |
--keep-window | 不要清除屏幕上显示过的部件 |
--max-input size | 指定输入的最大字符长度。默认为2048 |
--nocancel | 隐藏Cancel按钮 |
--no-collapse | 在对话文本中不要将制表符转换成空格 |
--no-kill | 将tailboxbg对话放到后台,并禁止该进程的SIGHUP信号 |
--no-label label | 为No按钮指定替代标签 |
--no-shadow | 不要显示对话窗口的投影效果 |
--ok-label label | 指定OK按钮的替代标签 |
--output-fd fd | 指定另一个输出文件描述符,而不是STDERR |
--print-maxsize | 将对话窗口的最大尺寸打印到输出中 |
--print-size | 将每个对话窗口的大小打印到输出中 |
--print-version | 将dialog的版本打印到输出中 |
--separate-output | 一次一行地输出checklist部件的结果而不用引号 |
--separator string | 为每个部件指定分割输出的字符串 |
--separate-widget string | 为每个部件指定分割输出的字符串 |
--shadow | 在每个窗口的右下角绘制阴影 |
--single-quoted | 需要时对多选列表的输出采用单引号 |
--sleep sec | 在处理完对话窗口之后延迟指定的秒数 |
--stderr | 将输出发送到STDERR(默认即是如此) |
--stdout | 将输出发送到STDOUT |
--tab-correct | 将制表符转换成空格 |
--tab-len n | 指定一个制表符占用的空格数(默认为8) |
--timeout sec | 指定无用户输入的话,sec秒后退出并返回错误代码 |
--title title | 指定对话窗口的标题 |
--trim | 从对话文本中删除前面是空格和换行符 |
--visit-items | 修改对话窗口中的制表符的停留位置,使其包括选项列表 |
--yes-label label | 为Yes按钮执行替代标签 |
(1)dialog命令支持运行时配置。dialog启动时先去检查是否设置了DIALOGRC环境变量,该变量保存配置文件路径。
如果没有找到,则使用$HOME/.dialogrc。如果这个也不存在,就尝查找编译时指定的GLOBALRC(/etc/dialogrc),如果这个也不存在,就用编译默认值。
(2)--backtitle选项是为了脚本中的菜单创建公共标题的简便办法。如果给每个对话窗口都指定了该选项,那么它在应用中将保持一致。
在脚本中使用dialog命令
这里需要注意两点:
1.如果有Cancel或者No按钮,检查dialog命令的退出状态码
2.重定向STDERR来获得输出值
下面是将之前的代码改用dialog实现
#!/bin/bash temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` disk_space(){ df -k > $temp dialog --textbox $temp 20 60 } whoseon(){ who > $temp dialog --textbox $temp 20 50 } menu_usage(){ cat /proc/meminfo > $temp dialog --textbox $temp 20 50 } dialog --menu "menu" 20 30 10 1 "Display disk space" 2 "Display logged on user" 3 "Display memory usage" 0 "Exit menu" 2>$temp2 if [ $? -ne 1 ] then selection=`cat $temp2` case $selection in 1) disk_space;; 2) whoseon;; 3) menu_usage;; 0) ;; *) dialog --msgbox "Sorry, invalid selection" 10 30 esac fi rm -f $temp $temp2 2>/dev/null
使用图形
KDE环境
安装kdialog
sudo apt-get install kdebase-bin
kdialog部件
和dialog类似,命令格式为:
kdialog display-options window-options arguments
window-options选项允许指定使用那种类型的窗口。
kdialog窗口选项
选项 | 描述 |
--checklist title [tag item status] | 多选列表菜单,状态会说明该选项是否被选定 |
--error text | 错误消息框 |
--inputbox text [init] | 输入文本框。可以用init指定默认值 |
--menu title [tag item] | 带有标题的菜单选择框,以及用tag标识的选项列表 |
--msgbox text | 显示指定文件的简单消息框 |
--password text | 隐藏用户输入的密码输入文本框 |
--radiolist title [tag item status] | 单选列表菜单,状态会说明该选项是否被选定 |
--separate-output | 为多选列表和单选列表菜单返回按行分开的选项 |
--sorry text | “抱歉”消息框 |
--textbox file [width] [height] | 显示file的内容的文本框,另外指定了width和height |
--title title | 为对话窗口的TitleBar区域指定一个标题 |
--warningyesno text | 带有Yes和No按钮的警告消息框 |
--warningcontinuecancel text | 带有Continue和Cancel按钮的警告消息框 |
--warningyesnocancel text | 带有Yes、No和Cancel按钮的警告消息框 |
--yesno text | 带有Yes和No按钮的提问框 |
--yesnocancel text | 带有Yes、No和Cancel按钮的提问框 |
checklist和radiolist允许你在列表中定义单独的选项以及他们默认是否选定
使用kdialog
kdialog与dialog最大的不同就是kdialog将输出重定向到了STDOUT中。
GNOME环境
zenity部件
zenity窗口部件
选项 | 描述 |
--calendar | 显示整月日历 |
--entry | 显示文本输入对话窗口 |
--error | 显示错误消息对话窗口 |
--file-selection | 显示完整的路径名和文件名对话窗口 |
--info | 显示信息对话窗口 |
--list | 显示多选列表或单选列表对话窗口 |
--notification | 显示通知图标 |
--process | 显示进度条对话窗口 |
--question | 显示yes/no对话窗口 |
--scale | 显示可调整大小的窗口 |
--text-info | 显示含有文本的文本框 |
--warning | 显示警告对话窗口 |
zenity提供的窗口就比之前的dialog效果好多了
zenity --calendar
当选择了日期之后,zenity会将值返回到STDOUT中,和kdialog一样
在脚本中使用zenity
#!/bin/bash temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` disk_space(){ df -k > $temp zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 300 } whoseon(){ who > $temp zenity --text-info --title "Logged on user" --filename=$temp --width 500 --height 200 } menu_usage(){ cat /proc/meminfo > $temp zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 500 } zenity --list --radiolist --title "Menu" --column "Select" \ --column "Menu Item" FALSE "Display disk space" FALSE "Display logged on user" FALSE "Display memory usage" FALSE "Exit" > $temp2 if [ $? -ne 1 ] then selection=`cat $temp2` case $selection in "Display disk space") disk_space;; "Display logged on user") whoseon;; "Display memory usage") menu_usage;; "Exit") ;; *) zenity --info "Sorry. invalid selection." esac fi rm -f $temp $temp2 2>/dev/null
zenity不支持菜单对话框
转贴请保留以下链接
本人blog地址
推荐阅读
-
《Linux命令行与shell脚本编程大全》 第十五章 学习笔记
-
Linux命令行与shell脚本编程大全笔记(正则表达式)
-
《Linux命令行与shell脚本编程大全》 第十七章 学习笔记
-
Linux命令行与shell脚本编程大全.第3版 第17章
-
《Linux命令行与shell脚本编程大全》 第二十二章 学习笔记
-
《Linux命令行与shell脚本编程大全》 第十六章 学习笔记
-
《Linux命令行与shell脚本编程大全》 第四章 学习笔记
-
《Linux命令行与shell脚本编程大全》 第五章 学习笔记
-
《Linux命令行与shell脚本编程大全》 第六章 学习笔记
-
《Linux命令行与shell脚本编程大全》 第十一章