簡年2:為shell腳本添加交互界面

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

1. Zenity

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

1. 日歷

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

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

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

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

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


日期

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


2. 文件選擇

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

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

界面如下:


選擇文件

3. 表單

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

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)建一個列表對話框鱼鸠,Zenity 在標(biāo)準(zhǔn)輸出返回選中行的第一列項(xiàng)目。
對話框里的數(shù)據(jù)必須指定行和列羹铅,可以由標(biāo)準(zhǔn)輸入提供蚀狰,每一項(xiàng)都必須由換行符分隔。
如果您使用--checklist--radiolist 選項(xiàng)职员,每一行必須以 “TRUE” 或 “FALSE” 開始麻蹋。
列表框支持以下選項(xiàng):
--column= 列
指定列表對話框顯示的列標(biāo)題。您必須為每個要顯示的列焊切,用 --column 選項(xiàng)指定一個列標(biāo)題扮授。
--checklist
指定列表框的第一列包含一個復(fù)選框。
--radiolist
指定列表框的第一列包含單選按鈕专肪。
--editable
指定顯示的項(xiàng)可以編輯糙箍。
--separator= 分隔符
指定列表框返回選中項(xiàng)時使用的字符。
--print-column= 列
指定選擇列上顯示什么牵祟,默認(rèn)是 “1”深夯,“ALL” 用于在列表上顯示所有列。
下面的例子顯示腳本如何創(chuàng)建一個列表對話框:

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

截圖:


列表

通常需要指定窗口寬高:

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

5. 通知圖標(biāo)

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

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

6. 消息

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

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

7. 密碼輸入

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

#!/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ā)生意外錯誤。";;
esac

截圖如下:


密碼框

8. 進(jìn)度

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

#!/bin/sh
(
echo "10" ; sleep 1
echo "# 更新郵件日志" ; sleep 1
echo "20" ; sleep 1
echo "# 復(fù)位定時計(jì)劃任務(wù)" ; sleep 1
echo "50" ; sleep 1
echo "該行會被忽略" ; 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)建一個文本輸入對話框缠俺。Zenity 將文本框的內(nèi)容返回到標(biāo)準(zhǔn)輸出。
文本輸入框支持以下選項(xiàng):
--text= 文本
指定在文本輸入框中顯示的文本贷岸。
--entry-text= 文本
指定在文本框的文本域里顯示的文本壹士。
--hide-text
隱藏文本框中輸入的字段內(nèi)容。
下面示范了如何創(chuàng)建一個文本輸入對話框:

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

截圖如下:


輸入框

10. 文本信息

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

#!/bin/sh

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

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

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


示例圖片

11. 范圍

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

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

12. 顏色選擇

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

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

![示例圖片]


2. KDialog

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子感耙,更是在濱河造成了極大的恐慌褂乍,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件即硼,死亡現(xiàn)場離奇詭異逃片,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)只酥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門褥实,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裂允,你說我怎么就攤上這事损离。” “怎么了绝编?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵僻澎,是天一觀的道長。 經(jīng)常有香客問我十饥,道長窟勃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任逗堵,我火速辦了婚禮秉氧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜒秤。我一直安慰自己汁咏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布作媚。 她就那樣靜靜地躺著攘滩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纸泡。 梳的紋絲不亂的頭發(fā)上漂问,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機(jī)與錄音弟灼,去河邊找鬼。 笑死冒黑,一個胖子當(dāng)著我的面吹牛田绑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抡爹,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼掩驱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欧穴,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤民逼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涮帘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拼苍,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年调缨,在試婚紗的時候發(fā)現(xiàn)自己被綠了疮鲫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡弦叶,死狀恐怖俊犯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伤哺,我是刑警寧澤燕侠,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站立莉,受9級特大地震影響绢彤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜桃序,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一杖虾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧媒熊,春花似錦奇适、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柠衅,卻和暖如春皮仁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菲宴。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工贷祈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喝峦。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓势誊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谣蠢。 傳聞我的和親對象是個殘疾皇子粟耻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容