Skip to content

图形化桌面中的脚本编程

创建文件菜单

创建菜单布局

默认情况下,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命令在滚动窗口中显示文件的内容
tailboxbgtailbox一样,但是在后台模式中运行
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

创建我们之前所制作的文本菜单的窗口版本。只要为每个选项提供一个选择标号和文本就行了

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选项

QQ图片20220809125022

QQ图片20220809125216

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