Appearance
图形化桌面中的脚本编程
创建文件菜单
创建菜单布局
默认情况下,echo命令只显示可打印文本字符。在创建菜单项时,非可打印字符通常也很有用,比如制表符和换行符。要在echo命令中包含这些字符,必须用-e选项
最后一行的-en选项会去掉末尾的换行符。这让菜单看上去更专业一些,光标会一直在行尾等待用户的输入
bash
1 #!/bin/bash
2 clear
3 echo -e "\t\t\tSys Admin Menu\n"
4 echo -e "\t1. Display disk space"
5 echo -e "\t2. Display logged on users"
6 echo -e "\t3. Display memory usage"
7 echo -e "\t0. Exit menu\n\n"
8 echo -en "\t\tEnter option: "
9 read -n 1 option
创建菜单函数
bash
1 #!/bin/bash
2 function diskspace {
3 clear
4 df -h
5 }
6 function whoseon {
7 clear
8 who
9 }
10 function menusage {
11 clear
12 cat /proc/meminfo
13 }
14 function diskspace {
15 clear
16 echo -e "\t\t\tSys Admin Menu\n"
17 echo -e "\t1. Display disk space"
18 echo -e "\t2. Display logged on users"
19 echo -e "\t3. Display memory usage"
20 echo -e "\t0. Exit menu\n\n"
21 echo -en "\t\tEnter option: "
22 read -n 1 option
23 }
24 while [ 1 ]
25 do
26 diskspace
27 df -h
28 case $option in
29 0)
30 break;;
31 1)
32 diskspace;;
33 2)
34 whoseon;;
35 3)
36 menusage;;
37 *)
38 clear
39 echo "Sorry, wrong selection"
40 esac
41 echo -en "\n\n\t\t\tHit any key to continue"
42 read -n 1 line
43 done
44 clear
使用select命令
bash
select variable in list
do
command
done
select命令只需要一条命令就可以创建出菜单,然后获取输入的答案并自动处理
list参数是由空格分隔的文本选项列表,这些列表构成了整个菜单。select命令会将每个列表项显示成一个带编号的选项,然后为选项显示一个由PS3环境变量定义的特殊提示符
bash
15 PS3="Enter option" # 设置选项选择的提示语
16 select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program"
17 do
18 case $option in
19 "Exit program")
20 break ;;
21 "Display disk space")
22 diskspace ;;
23 "Display logged on users")
24 whoseon ;;
25 "Display memory usage")
26 memusage ;;
27 *)
28 clear
29 echo "Sorry, wrong selection";;
30 esac
31 done
32 clear
在使用select命令时,记住,存储在变量中的结果值是整个文本字符串而不是跟菜单选项相关联的数字。文本字符串值才是你要在case语句中进行比较的内容
制作窗口
dialog包
部件 | 描述 |
---|---|
calendar | 提供选择日期的日历 |
checklist | 显示多个选项(其中每个选项都能打开或关闭) |
form | 构建一个带有标签以及文本字段(可以填写内容)的表单 |
fselect | 提供一个文件选择窗口来浏览选择文件 |
gauge | 显示完成的百分比进度条 |
infobox | 显示一条消息,但不用等待回应 |
inputbox | 提供一个输入文本用的文本表单 |
inputmenu | 提供一个可编辑的菜单 |
menu | 显示可选择的一系列选项 |
msgbox | 显示一条消息,并要求用户选择OK按钮 |
pause | 显示一个进度条来显示暂定期间的状态 |
passwordbox | 显示一个文本框,但会隐藏输入的文本 |
passwordform | 显示一个带标签和隐藏文本字段的表单 |
radiolist | 提供一组菜单选项,但只能选择其中一个 |
tailbox | 用tail命令在滚动窗口中显示文件的内容 |
tailboxbg | 跟tailbox 一样,但是在后台模式中运行 |
textbox | 在滚动窗口中显示文件的内容 |
timebox | 提供一个选择小时、分钟和秒数的窗口 |
yesno | 提供一条带有Yes和No按钮的简单消息 |
要在命令行上指定某个特定的部件,需使用双破折线格式。
bash
dialog --widget parameters
其中widget是表中的部件名,parameters定义了部件窗口的大小以及部件需要的文本
dialog部件都提供了两种形式的输出:
- 使用STDERR
- 使用退出状态码
可以通过dialog命令的退出状态码来确定用户选择的按钮。如果选择了Ye s或OK按钮,dialog命令会返回退出状态码0。如果选择了Cancel或No按钮,dialog命令会返回退出状态码1。可以用标准的$?变量来确定dialog部件中具体选择了哪个按钮
如果部件返回了数据,比如菜单选择,那么dialog命令会将数据发送到STDERR。可以用标准的bash shell方法来将STDERR输出重定向到另一个文件或文件描述符中
bash
dialog --inputbox "Enter your age: " 10 20 2>age.txt
msgbox
部件
会在窗口中显示一条简单的信息, 用户单击OK之后退出
bash
dialog --msgbox text height width
dialog命令会根据由height和width参数创建的窗口的大小来自动换行。如果想在窗口顶部放一个标题,也可以用--title参数,后接作为标题的文本
bash
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ dialog --title "Plase answer" --yesno "Is this thing on?" 10 20
dialog命令的退出状态码会根据用户选择的按钮来设置。如果用户选择了No按钮,退出状态码是1;如果选择了Ye s按钮,退出状态码就是0。
inputbox
部件
dialog命令会将文本字符串的值发给STDERR。你必须重定向STDERR来获取用户输入
bash
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ echo $?
0
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ cat age.txt
45jiao@jiao-virtual-machine:~/桌面/linux-shell/18$
testbox
部件
在窗口中显示大量的信息
出现一个有滚动条的窗口
bash
dialog --textbox /etc/passwd 15 45
menu部件
创建我们之前所制作的文本菜单的窗口版本。只要为每个选项提供一个选择标号和文本就行了
bash
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 4 "Exit" 2> test.txt
第一个参数: 窗口名
二三: 窗口大小
四: 显示的菜单总数, 要是数量多的话可以使用方向键滚动
之后的第一个是编号, 第二个是文本
fslect
部件
在处理文件名的时候
不用强制用户键入文件名,你就可以用fselect
部件来浏览文件的位置并选择文件
bash
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt
dialog选项
dialog命令支持运行时配置。该命令会根据配置文件模板创建一份配置文件。dialog启动时会先去检查是否设置了DIALOGRC环境变量,该变量会保存配置文件名信息。如果未设置该变量或未找到该文件,它会将
$HOME/.dialogrc
作为配置文件。如果这个文件还不存在的话,就尝试查找编译时指定的GLOBALRC文件,也就是/etc/dialogrc
如果这个文件也不存在的话,就用编译时的默认值
在脚本中使用dialog命令
- 如果有Cancel或者No 检查退出状态码
- 重定向STDERR获取输出值
bash
1 #!/bin/bash
2
3 temp=$(mktemp -t test.XXXXXX)
4
5 temp2=$(mktemp -t test2.XXXXXX)
6
7 function diskspace {
8 df -k > $temp
9 dialog --textbox $temp 20 60
10 }
11 function whoseon {
12 who > $temp
13 dialog --textbox $temp 20 50
14 }
15
16 function memusage
17 {
18 cat /proc/meminfo > $temp
19 dialog --textbox $temp 20 50
20 }
21
22 while [ 1 ]
23 do
24 dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3 "Display memory usage" 0 "Exit" 2> $temp2
25 if [ $? -eq 1 ]
26 then
27 break
28 fi
29
30 selection=$(cat $temp2)
31 case $selection in
32 1)
33 diskspace ;;
34 2)
35 whoseon ;;
36 3)
37 memusage ;;
38 0)
39 break ;;
40 *)
41 dialog --msgbox "Sorry, invalid selection" 10 30
42 esac
43 done
44 rm -f $temp 2> /dev/null
45 rm -f $temp2 2> /dev/null
使用图形
KDE环境
KDE图形化环境默认包含kdialog包。kdialog包使用kdialog命令在KDE桌面上生成类似于dialog式部件的标准窗口
kdialog部件
bash
kdialog display-options window-options arguments
window-options选项允许指定使用哪种类型的窗口部件。可用的选项如表18-3所示
选项 | 描述 |
---|---|
--checklist title [tag item status] | 带有状态的多选列表菜单,可以表明选项是否被选定 |
--error text | 错误消息框 |
--inputbox text [init] | 输入文本框。可以用init值来指定默认值 |
--menu title [tagitem] | 带有标题的菜单选择框,以及用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按钮的提问框 |
bash
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ kdialog --checklist "Items I need" 1 "Toothbrush" on 2 "Toothpaste" off 3 "Hair brush" on 4 "Deodorant" off 5 "Slippers" off
"1" "3" "5"
允许你在列表中定义单独的选项以及它们默认是否选定, 如果选择了OK按钮,kdialog就会将标号值发到STDOUT上
bsah
1 #!/bin/bash
2
3 temp=$(mktemp -t test.XXXXXX)
4
5 temp2=$(mktemp -t test2.XXXXXX)
6
7 function diskspace {
8 df -k > $temp
9 kdialog --textbox $temp 1000 10
10 }
11 function whoseon {
12 who > $temp
13 kdialog --textbox $temp 500 10
14 }
15
16 function memusage
17 {
18 cat /proc/meminfo > $temp
19 kdialog --textbox $temp 300 500
20 }
21
22 while [ 1 ]
23 do
24 kdialog --menu "Sys Admin Menu" 1 "Display disk space" 2 "Display users" 3 "Displ ay memory usage" 0 "Exit" > $temp2
25 if [ $? -eq 1 ]
26 then
27 break
28 fi
29
30 selection=$(cat $temp2)
31 case $selection in
32 1)
33 diskspace ;;
34 2)
35 whoseon ;;
36 3)
37 memusage ;;
38 0)
39 break ;;
40 *)
41 kdialog --msgbox "Sorry, invalid selection" 10 30
42 esac
43 done
44 rm -f $temp 2> /dev/null
45 rm -f $temp2 2> /dev/null
GNOME环境
支持两种流行的可执行窗口包
- gdialog
- zenity
zenity是大多数GNOME桌面Linux发行版上最常见的包(在Ubuntu和Fedora上默认安装)
zenity部件
选项 | 描述 |
---|---|
--calenda | 显示一整月日历 |
--entry | 显示文本输入对话窗口 |
--error | 显示错误消息对话窗口 |
--file-selection | 显示完整的路径名和文件名对话窗口 |
--info | 显示信息对话窗口 |
--list | 显示多选列表或单选列表对话窗口 |
--notification | 显示通知图标 |
--progress | 显示进度条对话窗口 |
--question | 显示yes/no对话窗口 |
--scale | 显示可调整大小的窗口 |
--text-info | 显示含有文本的文本框 |
--warning | 显示警告对话窗口 |
zenity命令行程序与kdialog和dialog程序的工作方式有些不同。许多部件类型都用另外的命令行选项定义,而不是作为某个选项的参数
bash
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ zenity --calendar
2022年08月25日
显示日历
bash
jiao@jiao-virtual-machine:~/桌面/linux-shell/18$ zenity --file-selection
/home/jiao/桌面/linux-shell/18/age.txt
文件选择
在脚本中使用
bash
1 #!/bin/bash
2
3 temp=$(mktemp -t test.XXXXXX)
4
5 temp2=$(mktemp -t test2.XXXXXX)
6
7 function diskspace {
8 df -k > $temp
9 zenity --text-info --title "Disk spacce" --filename=$temp --width 750 --height 400
10 }
11 function whoseon {
12 who > $temp
13 zenity --text-info --title "Logged in users" --filename=$temp --width 500 --height 400
14 }
15
16 function memusage
17 {
18 cat /proc/meminfo > $temp
19 zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 50 0
20 }
21
22 while [ 1 ]
23 do
24 zenity --list --radiolist --title "Sys Admin Menu" --column "Select" --column "Menu It em" FALSE "Display diskspace" FALSE "Display users" FALSE "Display memory usage" FALSE "Exit" > $temp2 --width=600 --height=400 # 设置有两列内容, 第一列为选项
25 if [ $? -eq 1 ]
26 then
27 break
28 fi
29
30 selection=$(cat $temp2)
31 case $selection in
32 "Display diskspace")
33 diskspace ;;
34 "Display users")
35 whoseon ;;
36 "Display memory usage")
37 memusage ;;
38 Exit)
39 break ;;
40 *)
41 zenity --info "Sorry, invalid selection"
42 esac
43 done
44 rm -f $temp 2> /dev/null
45 rm -f $temp2 2> /dev/null