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

使用shell腳本時,經常會出現用戶與腳本交互的時候,一般我們都是通過在終端內完成交互,也就是全字符界面。但今天重裝系統時順便寫了個自動備份與恢復的腳本(還沒寫完),因為我是在desktop下執行的腳本,突然想用一下GUI界面做交互,這樣看起來不用那么原始。所以就有了此文。

1. Zenity

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

1. 日歷

使用 --calendar 選項來創建日歷對話框。Zenity 在標準輸出中返回選定的日期。如果沒有在命令行指定日期,就使用當前日期。

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

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

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

上面是一個默認日期,如圖:


日期

默認返回的是系統格式,你可以使用--date-format格式化,見上面。


2. 文件選擇

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

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

界面如下:


選擇文件

3. 表單

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

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 選項創建一個列表對話框,Zenity 在標準輸出返回選中行的第一列項目。
對話框里的數據必須指定行和列,可以由標準輸入提供,每一項都必須由換行符分隔。
如果您使用--checklist--radiolist 選項,每一行必須以 “TRUE” 或 “FALSE” 開始。
列表框支持以下選項:
--column= 列
指定列表對話框顯示的列標題。您必須為每個要顯示的列,用 --column 選項指定一個列標題。
--checklist
指定列表框的第一列包含一個復選框。
--radiolist
指定列表框的第一列包含單選按鈕。
--editable
指定顯示的項可以編輯。
--separator= 分隔符
指定列表框返回選中項時使用的字符。
--print-column= 列
指定選擇列上顯示什么,默認是 “1”,“ALL” 用于在列表上顯示所有列。
下面的例子顯示腳本如何創建一個列表對話框:

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

截圖:


列表

通常需要指定窗口寬高:

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

5. 通知圖標

使用 --notification 選項創建一個通知對話框。
--text= 文本
指定在通知區域顯示的文本。
--listen=icon: 'text', message:'text', tooltip:'text', visible:'text',
使用 --listen 執行輸入監聽。
下面的腳本示范了如何創建一個通知區域圖標:

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

6. 消息

對于每一種類型,使用 --text 選項來指定在對話框里顯示的文本。

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

7. 密碼輸入

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

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

截圖如下:


密碼框

8. 進度

使用 --progress 選項創建一個進度對話框。
Zenity 從標準輸入一行行讀取數據。如果某一行以 # 開頭,進度框里的文本會被那一行上的文本替換,如果某一行只是一個數字,數字會被換成進度條的百分比。
進度框支持以下選項:
--text= 文本
指定顯示在進度框里的文本。
--percentage= 百分比
指定進度框開始時的百分比設定。
--auto-close
當達到 100% 時自動關閉對話框。
--pulsate
指定進度條跳動,直到從標準輸入讀到一個 EOF 文件結束符。
下面的腳本示范了如何創建一個進度對話框:

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

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

可以設置百分比:


進度條

9. 文本輸入

使用 --entry 選項創建一個文本輸入對話框。Zenity 將文本框的內容返回到標準輸出。
文本輸入框支持以下選項:
--text= 文本
指定在文本輸入框中顯示的文本。
--entry-text= 文本
指定在文本框的文本域里顯示的文本。
--hide-text
隱藏文本框中輸入的字段內容。
下面示范了如何創建一個文本輸入對話框:

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

截圖如下:


輸入框

10. 文本信息

使用 --text-info 選項來創建一個文本信息框。
文本信息框支持以下選項:
--filename= 文件名
指定一個加載到文本信息框里的文件。
--editable
顯示的文本允許編輯,當對話框關閉后,編輯后的文本顯示到顯示器上。
--font= 字體
指定文本字體。
--checkbox= 文本
啟用復選框,如 “我已閱讀并接受該條款?!?br> --html
啟用 html 支持。
--url= 網址
設置一個網址,而不是文件。只有當您使用 --html 選項時才有效。
下面的腳本示范了如何創建一個文本信息對話框:

#!/bin/sh

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

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

使用$?可以判斷輸入的結果。


示例圖片

11. 范圍

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

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

12. 顏色選擇

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

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

![示例圖片]


2. KDialog

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容