linux系统shell脚本中使用图形对话框
本文提供两种图形化方法
第一种是图形化shell即dialog,另一种是gtk+的zenity;
liunx 下的dialog 工具是一个可以和shell脚本配合使用的文本界面下的创建对话框的工具。
默认是已安装的,如果没有安装使用以下命令安装
sudo apt install dialog
每个对话框提供的输出有两种形式:
1. 将所有输出到stderr,不显示到屏幕。如果要将输出重定向到文件可以使用2>filename;
2. 使用退出状态码,“OK”为0,“NO”为1,"ESC"为255
通用选项 common options:(这个选项来设置dialog box的背景,颜色和 标题等)
[--title
[--no-cancel] 设置在输入框,菜单,和复选框中,不显示“cancel”项
[--clear] 完成清屏操作。在框体显示结束后,清除框体。这个参数只能单独使用,不能和别的参数联合使用。
[--ok-label
[--cancel-label
[--backtitle
[--begin
[--timeout
[--defaultno] 使的是默认值 yes/no,使用no
[--sleep
[--stderr] 以标准错误方式输出
[--stdout] 以标准方式输出
[--output-fd
[--output-separator
[--default-item
窗体类型:
使用命令dialog也可以直接查看具体参数
常见的对话框控件选项有:
[ –calendar ] 提供了一个日历,让你可以选择日期
[ –checklist ] 允许你显示一个选项列表,每个选项都可以被单独的选择 (复选框)
[ –from ] 允许您建立一个带标签的文本字段,并要求填写
[ –fselect ] 提供一个路径,让你选择浏览的文件
[ –gauge ] 显示一个表,呈现出完成的百分比,就是显示出进度。
[ –infobox ] 显示消息后,(没有等待响应)对话框立刻返回,但不清除屏幕 (信息框)
[ –inputbox ] 让用户输入文本 (输入框 )
[ –inputmenu ] 提供一个可供用户编辑的菜单 (可编辑的菜单框)
[ –menu ] 显示一个列表供用户选择 (菜单框)
[ –msgbox ] 显示一条消息,并要求用户选择一个确定按钮 (消息框 )
[ –pause ] 显示一个表格用来显示一个指定的暂停期的状态
[ –passwordbox ] 显示一个输入框,它隐藏文本
[ –passwordfrom ] 显示一个来源于标签并且隐藏的文本字段
[ –radiolist ] 提供一个菜单项目组,只有一个项目,可以选择 (单选框 )
[ –tailbox ] 在一个滚动窗口文件中使用tail命令来显示文本
[ –tailboxbg] 跟tailbox类似,但是在background模式下操作
[ –textbox ] 在带有滚动条的文本框中显示文件的内容 (文本框)
[ –timebox ] 提供一个窗口,选择小时,分钟,秒
[ –yesno ] 提供一个带有yes和no按钮的简单信息框 (是/否框)
命令示例
1.消息框
格式:dialog --msgbox text height width
例子:
(dialog --title TESTING --msgbox "this is a msgbox" 10 20)
ret=$?
if [ ${ret} -eq 0 ] ;then
echo "ok"
fi
2.yesno框
格式:dialog –yesno text height width
例子:
(dialog --title "yes/no" --no-shadow --yesno "do you want to click yes?" 10 30)
ret = $?
if [ ${ret} -eq 0 ] ;then
echo "yes clicked"
else
echo "not yes"
fi
3.输入框
格式:dialog --inputbox text height width
例子:
inputtxt=$(dialog --output-fd 1 --title "Input your name" --inputbox "Please input your name:" 10 30)
echo ${inputtxt}
4.密码框
格式:
dialog --passwordbox text height width [init]
例子:
passwd=$(dialog --output-fd 1 --title "Password" --passwordbox "Please type password:" 10 35)
echo ${passwd}
这样我们的密码就暴露出来了,是不是很不安全,所以通常我们会加上一个安全选项
--insecure 将每个字符用*来显示出来
passwd=$(dialog --output-fd 1 --title "Password" --insecure --passwordbox "Please type password:" 10 30)
echo ${passwd}
5.文本框
格式:dialog --textbox file height width
例子:
dialog --title "Please review the fstab" --textbox /etc/fstab 28 60
6.菜单框
格式:dialog --menu text height width menu-height tag1 item1 tag2 item2 …
例子:
selectedid=$(dialog --output-fd 1 --title "Pick a choice" --menu "Choose one" 12 35 5 1 "say hello to everyone" 2 "thanks for your support" 3 "exit")
echo ${selectedid}
7.Fselect框(文件选择框)
格式:dialog --fselect filepath height width
例子:
filename=$(dialog --output-fd 1 --title "Pick one file" --fselect /etc/ 7 40)
echo ${filename}
8.复选框
格式:dialog --checklist "Test" height width menu-height [tag1 item1 status1] [tag2 item2 status2] …
例子:
lst=$(dialog --output-fd 1 --backtitle "Checklist" --checklist "Test" 20 50 10 Memory Memory_Size on Disk Disk_Size off CPU CPU_count on)
for item in ${lst}
do
echo ${item} selected.
done
9.显示日历
格式:dialog --calendar "Date" height width day month year
例子:
#显示当前日期
thisdate=$(dialog --output-fd 1 --title "Calendar" --calendar "Date" 5 50)
echo ${thisdate}
#显示指定日期
thisdate=$(dialog --output-fd 1 --title "Calendar" --calendar "Date" 5 50 1 5 2020)
echo ${thisdate}
10.进度框架
格式:dialog --gauge text height width [
例子:
#固定进度显示
dialog --title "installation pro" --gauge "installation" 10 30 10
#实时动态进度
for i in {1..100} ;do echo $i;done |dialog --title "installation pro" --gauge "installation" 10 30
顺便补充一个tar命令压缩解压缩带进度条的实现
需要用到pv命令,默认是已经安装的,如果没有安装参考以下命令
yum install pv #centos
apt install pv #ubuntu
brew install pv #mac
# 解压缩
pv ${filename} | tar -zxf -
# 压缩
tar -cf - "${filename}" | pv -s $(($(du -sk "${filename}" | awk '{print $1}') * 1024)) | gzip > ${filename}.tar.gz
# 还可以在tar命令后加上以下选项用逗号代替进度 --checkpoint=100 --checkpoint-action=dot --totals
zenity
zenity是一个开源显示GTK+对话框的命令行应用程序,它允许在图形框中与shell交互信息。
该应用程序允许您在命令行中创建图形对话框,并使用户和shell之间的交互非常容易。
Zenity特性
FOSS软件
跨平台应用程序
允许GTK +对话框执行
命令行工具
在Shell脚本中的支持
用处
轻松创建GUI
比其他复杂工具更少的功能
使shell脚本能够与GUI用户交互
对于图形用户交互,可以进行简单的对话创建
Zentity默认安装或者在今天大多数的标准Linux发行库可用。
如果没有安装使用以下命令安装
sudo apt install zenity
Zenity基本对话框
1.快速日历对话框
thisdate=$(zenity --calendar)
echo ${thisdate}
2.错误提示框
zenity --title="error" --text="hhaha" --error
3.一般文本输入对话框
thistxt=$(zenity --entry --title="name" --text="please input your name:")
echo ${thistxt}
4.信息提示框
zenity --info --title="info" --text="hello info"
5.问题对话框
zenity --title="?" --text="1 are you ok ?" --question
6.进度条
zenity --title="progess of xxx" --text="runing ..." --progress --auto-close --percentage=30
#实时动态进度
for i in {1..100} ;do echo $i; sleep 0.2;done | zenity --title="progess of xxx" --text="runing ..." --progress --auto-close
#实时动态进度示例2
(
echo "50";
tar -zxvf test.tar.gz ;
echo "100";
) |zenity --progress --title="test" --text="test" --auto-close
7.缩放对话框
zenity --title="scale of xxx" --text="scale:" --scale
8.密码输入框
zenity --title="password of xxx" --text="password:" --password
9.窗体对话框
zenity --title="forms of xxx" --text="forms ..." --forms
--text=STRING
--separator=STRING
--add-entry=FIELDNAME
--add-password=FIELDNAME
--add-calendar=FIELDNAME
thisform=$(zenity --forms --title "" --text="信息" --separator="," \
--ok-label="确定" --cancel-label="取消" \
--add-entry="IP地址" --add-entry="端口号" \
--add-entry="域名" --add-entry="用户名" \
--add-password="密码")
if [ "$?" = "0" ] ;then
ip=$(awk -F, '{print $1}' <<<${thisform})
domain=$(awk -F, '{print $3}' <<<${thisform})
port=$(awk -F, '{print $2}' <<<${thisform})
username=$(awk -F, '{print $4}' <<<${thisform})
fi
echo "ip: ${ip}"
echo "port: ${port}"
echo "name: ${username}"
10.关于对话
zenity --about
11. 拾色器
thisrgb=$(zenity --title="please select your color" --color-selection)
echo ${thisrgb}
12. 文件选择器
thisfile=$(zenity --title="please select your file" --file-selection)
echo ${thisfile}
13. 列表对话框
zenity --list
List options
--text=STRING Set the dialog text
--column=STRING Set the column header
--checklist Use check boxes for first column
--radiolist Use radio buttons for first column
--separator=STRING Set output separator character
--multiple Allow multiple rows to be selected
--editable Allow changes to text
--print-column=NUMBER
Specify what column to print to standard output. The default is to return the first
column. 'ALL' may be used to print all columns.
--hide-column=NUMBER Hide a specific column
--hide-header Hides the column headers
# radiolist:
thisradio=$(zenity --list --text "Is this helpful?" \
--radiolist --column "Pick" --column "Opinion" \
TRUE Amazing FALSE Average FALSE "Difficult to follow" FALSE "Not helpful");
echo ${thisradio}
# checklist:
thisoption=$(zenity --list --text "What do you think of this?" \
--checklist --column "Pick" --column "options" \
TRUE "More pictures" TRUE "More complete post" \
FALSE "Includes Installation guidelines" \
FALSE "Create a forum for question queries" \
--separator=":");
echo ${thisoption}
14. 通知对话框
zenity --notification --text "Please update your system."
参考资料
https://www.jianshu.com/p/fd2122832a1e
https://www.howtoing.com/zenity-creates-graphical-gtk-dialog-boxes-in-command-line-and-shell-scripts/