linux系统shell脚本中使用图形对话框

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 <title>]  指定将在对话框的上方显示的标题字符串
[--colors]    解读嵌入式“\ Z”的对话框中的特殊文本序列,序列由下面的字符 0-7, b  B, u, U等,恢复正常的设置使用“\Zn”。
[--no-shadow]   禁止阴影出现在每个对话框的底部
[--shadow]   应该是出现阴影效果
[--insecure]   输入部件的密码时,明文显示不安全,使用星号来代表每个字符

[--no-cancel]   设置在输入框,菜单,和复选框中,不显示“cancel”项
[--clear]   完成清屏操作。在框体显示结束后,清除框体。这个参数只能单独使用,不能和别的参数联合使用。
[--ok-label <str>]   覆盖使用“OK”按钮的标签,换做其他字符。
[--cancel-label <str>]  功能同上
[--backtitle <backtitle>] 指定的backtitle字符串显示在背景顶端。
[--begin <y> <x>]   指定对话框左上角在屏幕的上的做坐标
[--timeout <secs>]   超时(返回的错误代码),如果用户在指定的时间内没有给出相应动作,就按超时处理
[--defaultno]   使的是默认值 yes/no,使用no
[--sleep <secs>]
[--stderr]  以标准错误方式输出
[--stdout]  以标准方式输出
[--output-fd <fd>] 指定输出文件描述符,如果是标准输出则使用--output-fd 1
[--output-separator <str>] 指定输出多个值时之间的分隔符,如--output-separator ','
[--default-item <str>]  设置在一份清单,表格或菜单中的默认项目。通常在框中的第一项是默认

窗体类型:
使用命令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  [<percent>]
例子:
#固定进度显示
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/
 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页