文章目录
18 图形化桌面环境中的脚本编程
18.1 创建文本菜单
18.1.1 创建菜单布局
clear #清除所有的字符
echo
echo -e "\t\t\tSys Admin Menu\n" #-e只显示可打印的文本字符
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 "\tEnter option:" #-n去掉末尾的换行符
read -n 1 option #-n限制读取的数量,只读一个字符
18.1.2 创建菜单函数
为还没有实现的函数先创建一个桩函数(stub function)。桩函数是一个空函数,或者只有一个echo语句,说明最终这里里需要什么内容。
function diskspace {
clear
echo "This is where the diskspace commands will go"
}
这里我们首先将菜单布局当成一个函数创建
function menu {
clear #清除所有的字符
echo
echo -e "\t\t\tSys Admin Menu\n" #-e只显示可打印的文本字符
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 "\tEnter option:" #-n去掉末尾的换行符
read -n 1 option #-n限制读取的数量,只读一个字符
}
18.1.3 添加菜单逻辑
menu
case $option in
0) echo ;;
1) diskspace ;;
2) whoseon ;;
3) menusage ;;
*) clear
echo "Sorry,wrong selection";;
esac
18.1.4 整合shell脚本菜单
#!/bin/bash
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:" #-n去掉末尾的换行>符
read -n 1 option #-n限制读取的数量,只读一个字符
}
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function memusage {
clear
cat /proc/meminfo
}
while [ 1 ]
do
menu
case $option in
0) break;;
1) diskspace ;;
2) whoseon ;;
3) menusage ;;
*) 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
感觉比上面的方法还要麻烦一些,这里贴原书的代码:
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包
msgbox部件
dialog --msgbox text height width
如果想在窗口顶部放一个标题,也可以用–title参数,后接作为标题的文本。
dialog --title Testing --msgbox "This is a test" 10 20
运行结果如下:
yesno部件
yesno部件进一步扩展了msgbox部件的功能,允许用户对窗口中显示的问题选择yes或no。它会在窗口底部生成两个按钮:一个是Yes,一个是No。用户可以用鼠标、制表符键或者键盘方向键来切换按钮。要选择按钮的话,用户可以按下空格键或者回车键。如果用户选择了No按钮,退出状态码是1;如果选择了Yes按钮,退出状态码就是0。
inputbox部件
inputbox部件为用户提供了一个简单的文本框区域来输入文本字符串。dialog命令会将文本字符串的值发给STDERR。你必须重定向STDERR来获取用户输入。
#输入年龄并将STDERR重定向到age.txt
dialog --inputbox "Enter your age:" 10 20 2>age.txt
textbox部件
textbox部件是在窗口中显示大量信息的极佳办法。它会生成一个滚动窗口来显示由参数所指定的文件中的文本。
dialog --textbox /etc/passwd 15 45
menu部件
第一个参数定义为菜单的标题,第二、三个参数定义了菜单窗口的高和宽,第四个参数表示一次显示的菜单项总数。dialog命令会将选定的菜单项文本发送到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
fselect部件
fselect
部件处理文件名非常方便,不用强制用户键入文件名,可以用fselect
部件来浏览文件的位置并选择文件。
18.2.2 dialog选项
18.2.3 在脚本中使用dialog命令
必须记住:
1.如果有Cancel
或者No
按钮,检查dialog命令的退出状态码
2.重定向STDERR
获取输出值
实现代码:
#!/bin/bash
# using dialog to create a menu
temp=$(mktemp -t test.XXXXXX)
temp2=$(mktemp -t test2.XXXXXX)
#菜单的相关函数实现
function diskspace {
df -k > $temp
dialog --textbox $temp 20 60
}
function whoseon {
who > $temp
dialog --textbox $temp 20 50
}
function memusage {
cat /proc/meminfo > $temp
dialog --textbox $temp 20 50
}
#持续运行,打印菜单并且重定向STDERR文件描述符
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 $temp 2> /dev/null
rm -f $temp2 2> /dev/null
18.3 使用图形
18.3.1 KDE环境
KDE图形化环境默认包含kdialog包。kdialog包使用kdialog命令在KDE桌面上生成类似于dialog式部件的标准窗口。
1.kdialog部件
kdialog display-options window-options arguments
2.在脚本中使用kdialog部件
注意这里唯一的区别是kdialog
使用STDOUT
输出。
18.3.2 GNOME环境
gnome
支持gdialog
和zenity
1.zenity部件
2.在脚本中使用zenity部件
zenity
没有沿袭dialog
和kdialog
中所采用的选项惯例,因此,将已有的交互式脚本迁移到zenity
上要花点工夫。