时间:2017年12月04日星期一
说明:本文部分内容均摘取自书籍《Linux命令行与shell脚本编程大全》,版权归原作者所有。《Linux命令行与shell脚本编程大全》(第三版)第十八章学习总结
第十八章:图形化桌面环境中的脚本编程
本章内容
- 创建文本菜单
- 创建文本窗口部件
- 添加X Window图形
18.1 创建文本菜单
创建交互式shell脚本最常用的方法是使用菜单,shell脚本菜单的核心是case命令,case命令会根据用户在菜单上的选择来执行特定命令。
18.1.1 创建菜单布局
常用命令
clear
清理出现在屏幕上的文本
echo -e
在echo命令中输出格式化的字符串,方便菜单项布局
echo -en
输出指定格式化字符串,但不会换行,光标在末尾等待用户输入
read -n 1
使用read命令-n选项来限制自读取一个字符
简单示例
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 "\t4. Exit menu\n\n"
echo -en "\t\tEnter option: "
read -n 1 option
18.1.2 创建菜单函数
- shell脚本菜单选项作为一组独立的函数实现起来更为容易
- 为每个菜单选项创建独立的shell函数
- 通过会为还没有实现的函数先创建一个桩函数
- 将菜单布局本身作为一个函数来创建
简单示例
function diskspace {
clear
echo "This is where the diskspace commands will go"
}
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 "\t4. Exit menu\n\n"
echo -en "\t\tEnter option: "
read -n 1 option
}
18.1.3 添加菜单逻辑
- 创建程序逻辑将菜单布局和函数结合起来
- case命令根据菜单中输入的字符来调用相应的函数
- 使用星号(*)来处理所有不正确的菜单项
简单示例
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
*)
clear
echo "Sorry, wrong selection";;
esac
18.1.4 整合shell脚本菜单
完整例子
编写menu1脚本
#!/bin/bash
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusagee {
clear
cat /proc/meminfo
}
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
}
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
18.1.5 使用select命令
命令格式:
select variable in list
do
commands
done
命令说明:
- list参数是由空格分割的文本选项列表,这些列表构成了整个菜单
- select命令获取输入的答案并自动处理
编写smenu1脚本
#!/bin/bash
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusagee {
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
18.2 制作窗口
18.2.1 dialog包
dialog命令使用命令行参数来决定生成哪种窗口部件
安装dialog包以及需要的库
sudo apt-get install dialog
dialog部件
- 部件:描述
- calendar:提供选择日期的日历
- checklist:显示多个选项(其中每个选项都能打开或关闭)
- form:构建一个带有标签以及文本字段(可以填写内容)的表单
- fselect:提供一个文件选择窗口来浏览选择文件
- guage:显示完成的百分比进度条
- infobox:显示一条消息,但不用等待回应
- inputbox:提供一个输入文本用的文本表单
- inputmenu:提供一个可编辑的菜单
- menu:显示可选择的一系列选项
- msgbox:显示一条消息,并要求用户选择ok按钮
- pause:显示一个进度条来显示暂定期间的状态
- passwordbox:显示一个文本框,但会隐藏输入的文本
- passwordform:显示一个带标签和隐藏稳定字段的表单
- radiolist:提供一组菜单选项,但只能选择其中一个
- tailbox:用tail命令在滚动窗口中显示文件的内容
- tailboxbg:跟 tailbox一样,但是在后台模式中运行
- textbox:在滚动窗口中显示文件的内容
- timebox:提供一个选择小时、分钟和秒数的窗口
- yesno:提供一个带有Yes和No按钮的简单消息
使用格式
dialog –widget parameters
1.msgbox部件
使用说明
dialog –title Testing –msgbox text height width
- text参数是在窗口中显示的字符串
- dialog命令会根据height和width参数创建的窗口大小来自动换行
- title参数指定窗口的标题
实例
dialog --title Testing --msgbox "This is a test" 10 20
2.yesno部件
使用说明
- yesno部件允许用户对窗口中显示的问题选择yes或no
- 用户选择了No按钮,退出状态码是1;如果选择了Yes按钮,退出状态码就是0
实例
dialog --title "Please answer" --yesno "Is this thing on?" 10 20
3.inputbox部件
使用说明
- inputbox提供一个简单的文本框区域来输入文本字符串
- dialog命令会将文本字符串的值发给STDERR,通过重定向STDERR来获取用户输入
- 用户选择了OK按钮,退出状态码是0;反之,退出状态码就是1
实例
dialog --inputbox "Enter your age: " 10 20 2>age.txt
4.textbox部件
使用说明
- textbox部件在窗口中显示大量信息
实例
dialog --textbox /etc/passwd 15 45
5.menu部件
使用说明
- menu部件用来创建文本菜单的窗口版本
- dialog命令会将选定的菜单项文本发送到STDERR,通过重定向STDERR来获取选择
实例
dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2>test.txt
6.fselect部件
使用说明
- 使用fselect部件来浏览文件的位置并选择文件
实例
dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt
18.2.2 dialog选项
- dialog命令有很多不同的选项
- --title选项可以设置窗口顶部的标题
- --backlist选项可以为脚本中的菜单创建公共标题
- 还有其它许多选项,此处省略
18.2.3 在脚本中使用dialog命令
如果要在脚本中使用dialog命令,则必须遵守以下规范
- 如果有Cancel或No按钮,检查dialog命令的退出状态码
- 通过重定向STDERR来获取输出值
使用dialog部件来创建系统管理菜单
编写menu3脚本
#!/bin/bash
temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)
function diskspace {
dialog --textbox $temp1 20 60
}
function whoseon {
who > $temp1
dialog --textbox $temp1 20 50
}
function memusage {
cat /proc/meminfo > $temp1
dialog --textbox $temp1 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 -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null
18.3 使用图形
18.3.1 KDE环境
- KDE图形化环境默认包含kdialog包
- kdialog包使用kdialog命令在KDE桌面上生成类似于dialog式部件的标准窗口
- 需要检查系统是否已安装kdialog包
1.kdialog部件
使用说明
格式:
kdialog display-options window-options arguments
- window-options选项指定使用哪种类型的窗口部件
实例:
kdialog --checklist "Items I need" 1 "Toothbrush" on 2 "Toothpaste" off 3 "Hair brush" on 4 "Deodorant" off 5 "Slippers" off
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按钮的提问框
2.使用kdialog
使用kdialog创建系统管理菜单
编写menu4脚本
#!/bin/bash
temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)
function diskspace {
df -k > $temp1
kdialog --textbox $temp1 1000 10
}
function whoseon {
who > $temp1
kdialog --textbox $temp1 500 10
}
function memusage {
cat /proc/meminfo > $temp1
kdialog --textbox $temp1 300 500
}
while [ 1 ]
do
kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2
if [ $? -eq 1 ]
then
break
fi
selection=$(cat $temp2)
case $selection in
1)
diskspace ;;
2)
whoseon ;;
3)
memusage ;;
0)
break ;;
*)
kdialog --msgbox "Sorry, invalid selection" 10 30
esac
done
rm -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null
18.3.2 GNOME环境
GNOME图形化环境支持两种流行的可生成标准窗口的包
- gdialog
- zenity
1.zenity
zenity窗口部件
- 选项:描述
- --calendar:显示一整月日历
- --entry:显示文本输入对话窗口
- --error:显示错误消息对话窗口
- --file-selection:显示完整的路径名和文件名对话窗口
- --info:显示信息对话窗口
- --list:显示多选列表或单选列表对话窗口
- --notification:显示通知图标
- --progress:显示进度条对话窗口
- --question:显示yes/no对话窗口
- --scale:显示可调整大小的窗口
- --text-info:显示含有文本的文本框
- --waring:显示警告对话窗口
2.在脚本中使用zenity
编写menu5脚本
#!/bin/bash
temp1=$(mktemp -t test1.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)
function diskspace {
df -k > $temp1
zenity --text-info --title "Disk space" --filename=$temp1 --width 750 --height 10
}
function whoseon {
who > $temp1
zenity --text-info --title "Logged in users" --filename=$temp1 --width 500 --height 10
}
function memusage {
cat /proc/meminfo > $temp1
zenity --text-info --title "Memory usage" --filename=$temp1 --width 300 --height 500
}
while [ 1 ]
do
zenity --list --radiolist --title "Sys Admin Menu" --column "Select" --column "Menu Item" FALSE "Display diskspace" FALSE "Display users" FALSE "Display memory usage" FALSE "Exit" > $temp2
if [ $? -eq 1 ]
then
break
fi
selection=$(cat $temp2)
case $selection in
"Display diskspace")
diskspace ;;
"Display users")
whoseon ;;
"Display memory usage")
memusage ;;
Exit)
break ;;
*)
zenity --info "Sorry, invalid selection" 10 30
esac
done
rm -f $temp1 2> /dev/null
rm -f $temp2 2> /dev/null
18.4 小结
本章主要讲解了如何在shell脚本中创建菜单以及在图形化环境中编写交互式脚本
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。