簡(jiǎn)年2:為shell腳本添加交互界面

使用shell腳本時(shí),經(jīng)常會(huì)出現(xiàn)用戶與腳本交互的時(shí)候,一般我們都是通過在終端內(nèi)完成交互,也就是全字符界面。但今天重裝系統(tǒng)時(shí)順便寫了個(gè)自動(dòng)備份與恢復(fù)的腳本(還沒寫完),因?yàn)槲沂窃赿esktop下執(zhí)行的腳本,突然想用一下GUI界面做交互,這樣看起來不用那么原始。所以就有了此文。

1. Zenity

第一個(gè)介紹的工具就是Zenity,它是Gnome下的一個(gè)項(xiàng)目(大概),在大部分發(fā)行版中都自動(dòng)安裝了這個(gè)工具,因此你可以直接使用。

1. 日歷

使用 --calendar 選項(xiàng)來創(chuàng)建日歷對(duì)話框。Zenity 在標(biāo)準(zhǔn)輸出中返回選定的日期。如果沒有在命令行指定日期,就使用當(dāng)前日期。

日歷對(duì)話框支持以下選項(xiàng):
--text= 文本
指定日歷對(duì)話框里顯示的文本。
--day= 天
指定日歷對(duì)話框中的日子。天必須是介于 1~31 之間的數(shù)字。
--month= 月份
指定日歷對(duì)話框中的月份。月份必須是介于 1~12 之間的數(shù)字。
--year= 年
指定日歷對(duì)話框中的年份。
--date-format= 格式
指定選定的日期返回時(shí)的樣式。默認(rèn)的格式取決于您的區(qū)域設(shè)置。格式必須可以被 strftime 函數(shù)接受,例如 %A %d/%m/%y。

下面的腳本示范了如何創(chuàng)建一個(gè)日歷對(duì)話框:

zenity --calendar \
--title="選擇日期" \
--text="通過點(diǎn)擊選擇日期。" \
--day=21 --month=01 --year=2016

上面是一個(gè)默認(rèn)日期,如圖:


日期

默認(rèn)返回的是系統(tǒng)格式,你可以使用--date-format格式化,見上面。


2. 文件選擇

使用 --file-selection 選項(xiàng)創(chuàng)建一個(gè)文件選擇對(duì)話框。Zenity 在標(biāo)準(zhǔn)輸出返回選中的文件或目錄。默認(rèn)的文件選擇對(duì)話框模式是打開對(duì)話框。
文件選擇對(duì)話框支持以下選項(xiàng):
--filename= 文件名
指定文件選擇對(duì)話框在第一次顯示時(shí),選定的文件或文件夾。
--multiple
允許在文件選擇對(duì)話框里選中多個(gè)文件名。
--directory
在文件選擇對(duì)話框里只允許選中文件夾。
--save
設(shè)置文件選擇對(duì)話框模式為保存對(duì)話框。
--separator= 分隔符
指定用于分隔返回的文件名列表的字符。
下面示范了如何創(chuàng)建一個(gè)文件選擇對(duì)話框:

FILE=`zenity --file-selection --title="選擇文件"`
case $? in
         0)
                 echo "$FILE 被選中。";;
         1)
                 echo "沒有選擇文件。";;
         -1)
                 echo "發(fā)生意外錯(cuò)誤。";;
esac

界面如下:


選擇文件

3. 表單

使用 --forms 選項(xiàng)創(chuàng)建一個(gè)表單對(duì)話框。
表單對(duì)話框支持以下選項(xiàng):
--add-entry= 字段名稱
在表單對(duì)話框中添加新的輸入框。
--add-password= 字段名
在表格對(duì)話框中輸入新的密碼輸入框。(隱藏文本)
--add-calendar= 字段名稱
在表格對(duì)話框中添加新日歷。
--text= 文本
設(shè)置對(duì)話框文本。
--separator= 分隔符
設(shè)置輸出分隔符字符。(默認(rèn):|)
--forms-date-format= 格式
設(shè)置返回日期的格式。默認(rèn)的格式取決于您的區(qū)域設(shè)置。格式必須可以被 strftime 函數(shù)接受,例如 %A %d/%m/%y。
下面的腳本示范了如何創(chuàng)建一個(gè)表單對(duì)話框:

zenity --forms --title="添加好友" \
    --text="輸入您朋友的信息。" \
    --separator="," \
    --add-entry="名" \
    --add-entry="姓" \
    --add-entry="郵件" \
    --add-calendar="生日" >> addr.csv

截圖如下:


表單

看一下保存的文件:

$ cat addr.csv
xx,aa,ss,2017年01月21日

4. 列表

使用 --list 選項(xiàng)創(chuàng)建一個(gè)列表對(duì)話框,Zenity 在標(biāo)準(zhǔn)輸出返回選中行的第一列項(xiàng)目。
對(duì)話框里的數(shù)據(jù)必須指定行和列,可以由標(biāo)準(zhǔn)輸入提供,每一項(xiàng)都必須由換行符分隔。
如果您使用--checklist--radiolist 選項(xiàng),每一行必須以 “TRUE” 或 “FALSE” 開始。
列表框支持以下選項(xiàng):
--column= 列
指定列表對(duì)話框顯示的列標(biāo)題。您必須為每個(gè)要顯示的列,用 --column 選項(xiàng)指定一個(gè)列標(biāo)題。
--checklist
指定列表框的第一列包含一個(gè)復(fù)選框。
--radiolist
指定列表框的第一列包含單選按鈕。
--editable
指定顯示的項(xiàng)可以編輯。
--separator= 分隔符
指定列表框返回選中項(xiàng)時(shí)使用的字符。
--print-column= 列
指定選擇列上顯示什么,默認(rèn)是 “1”,“ALL” 用于在列表上顯示所有列。
下面的例子顯示腳本如何創(chuàng)建一個(gè)列表對(duì)話框:

zenity --list \
  --title="選擇您想查看的 Bugs" \
  --column="Bug 編號(hào)" --column="嚴(yán)重" --column="描述" \
    992383 Normal "多選時(shí) GtkTreeView 崩潰" \
    293823 High "GNOME 字典不能使用代理" \
    393823 Critical "菜單編輯器在 GNOME 2.0 中不能運(yùn)行"

截圖:


列表

通常需要指定窗口寬高:

  --height="600"
  --width="1000"

5. 通知圖標(biāo)

使用 --notification 選項(xiàng)創(chuàng)建一個(gè)通知對(duì)話框。
--text= 文本
指定在通知區(qū)域顯示的文本。
--listen=icon: 'text', message:'text', tooltip:'text', visible:'text',
使用 --listen 執(zhí)行輸入監(jiān)聽。
下面的腳本示范了如何創(chuàng)建一個(gè)通知區(qū)域圖標(biāo):

zenity --notification --listen
message: this is the message text

6. 消息

對(duì)于每一種類型,使用 --text 選項(xiàng)來指定在對(duì)話框里顯示的文本。

  • 6.1 錯(cuò)誤
    使用 --error 選項(xiàng)創(chuàng)建一個(gè)錯(cuò)誤對(duì)話框。
    下面示范了如何創(chuàng)建一個(gè)錯(cuò)誤對(duì)話框:
zenity --error \
--text="找不到 /var/log/syslog。"
  • 6.2 信息
    使用 --info 選項(xiàng)創(chuàng)建一個(gè)信息對(duì)話框。
    下面示范了如何創(chuàng)建一個(gè)信息對(duì)話框:
zenity --info \
--text="合并完成。更新了 3 / 10 個(gè)文件。"
  • 6.3 問題
    使用 --question 選項(xiàng)創(chuàng)建一個(gè)問題對(duì)話框。
    下面的腳本示范了如何創(chuàng)建一個(gè)問題對(duì)話框:
zenity --question \
--text="您確認(rèn)要繼續(xù)嗎?"
  • 6.4 警告
    使用 --warning 選項(xiàng)創(chuàng)建一個(gè)警告對(duì)話框。
    下面的腳本示范了如何創(chuàng)建一個(gè)警告對(duì)話框:
zenity --warning \
--text="拔下電源線,避免觸電。"

7. 密碼輸入

使用 --password 選項(xiàng)創(chuàng)建一個(gè)口令對(duì)話框。
口令輸入對(duì)話框支持以下選項(xiàng):
--username
顯示用戶名字段。
下面的腳本示范了如何創(chuàng)建一個(gè)口令輸入對(duì)話框:

#!/bin/sh
ENTRY=`zenity --password --username`
case $? in
         0)
        echo "用戶名: `echo $ENTRY | cut -d'|' -f1`"
        echo "密碼: `echo $ENTRY | cut -d'|' -f2`"
        ;;
         1)
                echo "停止登陸。";;
        -1)
                echo "發(fā)生意外錯(cuò)誤。";;
esac

截圖如下:


密碼框

8. 進(jìn)度

使用 --progress 選項(xiàng)創(chuàng)建一個(gè)進(jìn)度對(duì)話框。
Zenity 從標(biāo)準(zhǔn)輸入一行行讀取數(shù)據(jù)。如果某一行以 # 開頭,進(jìn)度框里的文本會(huì)被那一行上的文本替換,如果某一行只是一個(gè)數(shù)字,數(shù)字會(huì)被換成進(jìn)度條的百分比。
進(jìn)度框支持以下選項(xiàng):
--text= 文本
指定顯示在進(jìn)度框里的文本。
--percentage= 百分比
指定進(jìn)度框開始時(shí)的百分比設(shè)定。
--auto-close
當(dāng)達(dá)到 100% 時(shí)自動(dòng)關(guān)閉對(duì)話框。
--pulsate
指定進(jìn)度條跳動(dòng),直到從標(biāo)準(zhǔn)輸入讀到一個(gè) EOF 文件結(jié)束符。
下面的腳本示范了如何創(chuàng)建一個(gè)進(jìn)度對(duì)話框:

#!/bin/sh
(
echo "10" ; sleep 1
echo "# 更新郵件日志" ; sleep 1
echo "20" ; sleep 1
echo "# 復(fù)位定時(shí)計(jì)劃任務(wù)" ; sleep 1
echo "50" ; sleep 1
echo "該行會(huì)被忽略" ; sleep 1
echo "75" ; sleep 1
echo "# 重啟系統(tǒng)" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
  --title="更新系統(tǒng)日志" \
  --text="掃描郵件日志..." \
  --percentage=0

if [ "$?" = -1 ] ; then
        zenity --error \
          --text="更新被取消。"
fi

可以設(shè)置百分比:


進(jìn)度條

9. 文本輸入

使用 --entry 選項(xiàng)創(chuàng)建一個(gè)文本輸入對(duì)話框。Zenity 將文本框的內(nèi)容返回到標(biāo)準(zhǔn)輸出。
文本輸入框支持以下選項(xiàng):
--text= 文本
指定在文本輸入框中顯示的文本。
--entry-text= 文本
指定在文本框的文本域里顯示的文本。
--hide-text
隱藏文本框中輸入的字段內(nèi)容。
下面示范了如何創(chuàng)建一個(gè)文本輸入對(duì)話框:

zenity --entry \
--title="添加新配置" \
--text="輸入新配置的名稱:" \
--entry-text "新配置"

截圖如下:


輸入框

10. 文本信息

使用 --text-info 選項(xiàng)來創(chuàng)建一個(gè)文本信息框。
文本信息框支持以下選項(xiàng):
--filename= 文件名
指定一個(gè)加載到文本信息框里的文件。
--editable
顯示的文本允許編輯,當(dāng)對(duì)話框關(guān)閉后,編輯后的文本顯示到顯示器上。
--font= 字體
指定文本字體。
--checkbox= 文本
啟用復(fù)選框,如 “我已閱讀并接受該條款。”
--html
啟用 html 支持。
--url= 網(wǎng)址
設(shè)置一個(gè)網(wǎng)址,而不是文件。只有當(dāng)您使用 --html 選項(xiàng)時(shí)才有效。
下面的腳本示范了如何創(chuàng)建一個(gè)文本信息對(duì)話框:

#!/bin/sh

# 腳本目錄下必須要有一個(gè)名為"COPYING"的文件。
FILE=`dirname $0`/COPYING

zenity --text-info \
       --title="License" \
       --filename=$FILE \
       --checkbox="我同意該協(xié)議。"

使用$?可以判斷輸入的結(jié)果。


示例圖片

11. 范圍

使用 --scale 選項(xiàng)創(chuàng)建一個(gè)范圍對(duì)話框。
范圍對(duì)話框支持以下選項(xiàng):
--text= 文本
設(shè)置對(duì)話框文本。(默認(rèn):調(diào)整范圍值)
--value= 值
設(shè)置初始值。(默認(rèn):0) 您必須在最小值和最大值之間指定一個(gè)值。
--min-value= 值
設(shè)置最小值。(默認(rèn):0)
--max-value= 值
設(shè)置最大值。(默認(rèn):100)
--step= 值
設(shè)置步長(zhǎng)。(默認(rèn):1)
--print-partial
將值打印為標(biāo)準(zhǔn)輸出,無論值何時(shí)變化。
--hide-value
隱藏對(duì)話框中的值。
下面的腳本示范了如何創(chuàng)建一個(gè)范圍對(duì)話框:

#!/bin/sh
VALUE=`zenity --scale --text="選擇窗口透明度。" --value=50`
case $? in
         0)
        echo "您選中了 $VALUE%。";;
         1)
                echo "未選中值。";;
        -1)
                echo "發(fā)生意外錯(cuò)誤。";;
esac
示例圖片

12. 顏色選擇

使用 --color-selection 選項(xiàng)創(chuàng)建一個(gè)顏色選擇對(duì)話框。
顏色選擇對(duì)話框支持以下選項(xiàng):
--color= 值
設(shè)置初始顏色。(例如:#FF0000)
--show-palette
顯示調(diào)色板。
下面的腳本示范了如何創(chuàng)建一個(gè)顏色選擇對(duì)話框:

#!/bin/sh
COLOR=`zenity --color-selection --show-palette`
case $? in
         0)
        echo "您選擇了 $COLOR。";;
         1)
                echo "未選擇顏色。";;
        -1)
                echo "發(fā)生意外錯(cuò)誤。";;
esac

![示例圖片]


2. KDialog

上面介紹的是Gnome項(xiàng)目下的工具,同樣的,Kde項(xiàng)目下同樣也有這樣的工具,用法更加豐富,不過即便是kde桌面的發(fā)行版,也自帶了zenity工具因此只需要使用一個(gè)就可以了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容