shell腳本一直單調,可是在圖形環境下運行,除了read和echo語句外,還有其餘許多與腳本用戶交互的方法。這一節深刻介紹幾種不一樣的方法。shell
建立交互式的shell文本,主要使用case語句ubuntu
肯定所要顯示的內容: echo -e #-e指定了輸出內容中必需要包含製表符和換行符。windows
例如:echo -e "1.\tDisplay disk space"bash
設置菜單:函數
clear echo echo -e "\t\t\tSys Admin Menu\n" echo -e "\t1.Display disk space" echo -e "\t2.Display logged on users" echo -e "\t3.Display memory usage" echo -e "\t0.Exit menu/n/n" echo -en "\t\tEnter option: " #-en 顯示該行,而不在行尾添加換行符
建立菜單的最後一部分是獲取客戶的輸入。咱們經過read命令來完成工具
read -n 1 option
爲每一個選項建立獨立的函數,而後再在case語句中調用便可;佈局
function diskspace { clear echo "This is where the diskspace commands will go." }
在shell腳本菜單中,有助於解決問題的一種作法是將菜單佈局自己做爲函數來建立:測試
function menu { clear echo echo -e "\t\t\tSys Admin Menu\n" echo -e "\t1.Display disk space" echo -e "\t2.Display logged on users" echo -e "\t3.Display memory usage" echo -e "\t0.Exit program\n\n" echo -en "\t\tEnter option: " read -n 1 option }
這樣,咱們只要代用menu函數,就能夠很容易的隨時再顯示該菜單便可。this
再添加邏輯關係。須要使用case語句來完成spa
menu case $option in 0) break ;; 1) diskspace ;; 2) whoseon ;; 3) memusage ;; *) clear echo "Sorry, wrony selection" ;; esac
有了選項,函數,與邏輯關係,咱們須要將他們組合起來:
#!/bin/bash # simple script menu function diskspace { clear df -k } function whoseon { clear who } function memusage { clear cat /proc/meminfo } function menu { clear echo echo -e "\t\t\tSys Admin Menu\n" echo -e "\t1.Display disk space" echo -e "\t2.Display logged on users" echo -e "\t3.Display memory usage" echo -e "\t0.Exit program\n\n" echo -en "\t\tEnter option: " read -n 1 option } while [ 1 ] do menu case $option in 0) break ;; 1) diskspace ;; 2) memusage ;; *) clear echo "Sorry, wrong selection";; esac echo =en "\n\m\t\tHit any key to continue" read -n 1 line done clear
多加了一個while循環,不斷重複菜單,直到用戶選擇0,則跳出循環;
這個腳本模板用於建立任何的shell腳本菜單界面。它同樂與用戶交互的一種簡單方式;
select命令允許從單命令行建立菜單。而後獲取輸入的答案並自動處理它。
select variable in list do commands done
列表參數是用空格隔開的構建菜單的的文本項列表。select命令將列表中的每一項顯示爲一個編號選項,而後爲選擇顯示一個特殊的提示符(由PS3環境變量定義)
#!/bin/bash # using select in the menu function diskspace { clear df -k } function whoseon { clear who } function memusage { clear cat /paroc/meminfo } PS3="Enter option: "
#自動完成頁面佈局,和獲取輸入的答案; select option in "Display disk space" "Display logged on users" "Display memory usage" "Exit program" do case $option in "Exit program") break ;; "Display disk space") diskspace ;; "Display logged on users") whoseon ;; "Display memory usage") memusage ;; *) clear echo "Sorry, wrong selection" ;; esac done clear
運行該腳本:
如今腳本變得較爲複雜,則須要顏色來區分;
ANSI轉意碼以控制序列顯示器(GSI)開頭,後面表示在顯示器上執行的操做數據。要控制顯示格式,必須使用選擇圖形再現(SGR select graphic rendition)
格式爲:CSIn[;k]m
m表明SGR轉意碼。n和k參數定義所使用的顯示控制。顯示控制參數有3類:一、效果控制代碼;二、前景色控制代碼;三、背景色控制代碼。以下圖:
例如:斜體字 GSI3m
例如:斜體閃爍字 GSI3;5m
前景色和背景色則用兩位數來控制:
指定白色爲前景色:GSI37m
設置白色爲背景:GSI47m
在個控制碼中,能夠將這兩種屬性組合在一塊兒。所以,要將背景色設置爲黑絲,前景色設置爲紅色,能夠發送代碼:GSI31;40m
咱們還須要echo命令,向發送普通文本同樣,將ANSI轉意碼發送到終端會話。
一個完整的轉意碼:^[[0m #控制代碼0,它將把顯示重置爲默認設置。
$ echo ^[[41mThis is a test
此次測試後,新的shell提示符將恢復其原來的顏色方案:
$ echo ^[[1mThis is a test^[[0m This is a test
若是須要設置背景色和前景色,ANSI轉意控制碼允許在一個轉移序列中指定兩個轉意碼:
$ echo "^[[33;44mThis is a test^[[0m" This is a test
在shell中調用ANSI轉意控制碼。
#!/bin/bash # menu using colors function diskspace { clear df-k } funciton whoseon clear who } function memusage { clear cat /proc/meminfo } function menu { clear echo echo -e "\t\t\tSys Admin Menu\n" echo -e "\t1.Display disk space" echo -e "\t2.Display logged on users" echo -e "\t3.Display memory usage" echo -e "^[[1m\t0. Exit program\n\n^[[0m^[[44;33m" echo -en "\t\tEnter option: " read -n 1 option } echo "^[[44;33m" while [ 1 ] do menu case $option in 0) break ;; 1) diskapace ;; 2) whoseon ;; 3) memuage ;; *) clear echo -e "^[[5m\t\t\tSorry,wrong selection^[[0m^[[44;33m";; esac echo -en "\n\n\t\t\tHit any key to continue" read -n 1 line done echo "^[[0m" clear
dialog工具爲咱們製做相似於windows的對話框
widget是dialog中的小部件,能夠用來包裝選項;
用法:dialog --widget parameters
parameters定義該小部件窗口的代銷以及它所虛的任何文本。
每一個對話框小部件均以兩種形式提供輸出:一、使用STDERR;二、使用退出代碼狀態;
若是小部件返回任何數據,例如一個菜單選項,dialog命令將該數據發送到STDERR。可使用標準的bash shell技術講STDERR輸出重定向至另一個文件或文件描述;
用法:dialog --inputbox "Enter your age:" 10 20 2>age.txt
一、msgbox小部件
顯示簡單的信息
dialog --msgbox test height width #定義height和width參數自動調整文本以適應所穿件的窗口大小。--title參數定義標題
dialog --title Testing --msgbox "This is a test" 10 20
二、yesno小部件
提供yes/no選項的串口
dialog --title "Please answer" --yesno "Is this thing on?" 10 20
echo $?
三、輸入框小部件
inputbox小部件,爲用戶輸入文本字符串,提供了一個簡單的文本框。
dialog --inputbox "Enter your age:" 10 20 2>age.txt
echo $?
cat age.txt
四、文本框小部件
在這個文本框內能夠輸入大量的提示信息
dialog --texbox /etc/passwd 15 45
五、菜單小部件
提供菜單選項
dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display users" 3"Display memory usage" 4 "Exit" 2>text.txt
六、fselect小部件
使用文件名時,fselect小部件機器方便。無需前置用戶輸入文件名,而是利用fselect小部件流量文件從而選擇文件。
dialog --title "Select a file" --fselect $HOME/ 10 50 2>file.txt
分爲左側目錄列表;右側目錄列表;和輸入列表;
dialog還有不少的長選線,提供參數選擇;
--backtitle 選項時穿件貫穿腳本的通用菜單標題的一種時分方便的方法。若是爲每一個對話框窗口自定,該選項將貫穿應用程序始終,爲腳本穿件專業級的外觀;
使用dialog命令注意兩點:一、若是cancel或者no按鈕可用,請檢查dialog命令的退出狀態;二、重定向STDERR以獲取輸出值;
#!/bin/bash # using dialog to create a menu temp=`mktemp -t test.XXXXXX` temp2=`mktemp -t test2.XXXXXX` function diskspace { df -k > $temp dialog --textbox $temp 20 60 } function whoseon { who > $temp dialog --textbox $temp 20 50 } function memusage { cat /proc/meminfo > $temp dialog --textbox $temp 20 50 } while [ 1 ] do dialog --menu "Sys Admin Menu" 20 30 10 1 "Display disk space" 2 "Display user" 3 "Display memory usage" 0 "Exit" 2> $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) dialog --msbox "Sorry, invalid selection" 10 30 esac done rm -f $temp 2> /dev/null rm -f $temp2 2> /dev/null
若是須要更多的圖形,不管是KDE好事GNOME周免都擴充了dialog命令的思想。各自都有本身的X Windows圖形小不講;
kdialog和zenity分別就是KDE和GNOME的桌面圖形工具;
kdialog工具;
一、kdialog小部件
使用格式:kdialog display-options window-options arguments
使用kdialog窗口小部件時,會在KDE桌面環境下顯示爲一個獨立窗口,而不是包含在終端模擬器會話中
checklist和radiolist小部件允許您定義列表中的單獨項目,以及它們是否默認選中:
kdialog --checklist "Items I need" 1 "Toothbrush" on 2 "Toothpaste" off 3 "Hair brush" on 4 "Deodorant" off 5 "Slippers" off
二、使用kdialog
使用對話框小部件。使得kdialog窗口輸出使用STDOUT而非STDERR輸出;
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
#!/bin/bash # using kdialog to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp kdialog --textbox $temp 1000 10 } function whoseon { who > $temp kdialog --texbox $temp 500 10 } function memusage { cat /proc/meminfo > $temp kdialog --textbox $temp 300 500 } while [ 1 ] do kdialog --menu "Sys Admin Menu" "1" "Display disk space" "2" "Display users" "3" "Display memory usage" "0" "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in 1) diskspace ;; 2) whoseon ;; 3) memusage ;; 0) break ;; *) kdialog --msgbox "Sorry, invalid selection" esac done
GNOME圖形化環境支持兩種能夠生成標準串口流行軟件包:一、gdialog;二、zenity;
zenity是最多見的軟件包。本地介紹zenity的功能並說明如何在shell及保本中使用它。
一、zenity小部件
zenity程序的工做方式與kdialog程序和dialog程序略有不一樣。許多類型的小不講要在命令行上使用附加的選項來定義,而不是將它們做爲選項的參數。
$ zenity --calendar
11/25/2019
$ zenity --file=selection
/home/ubuntu/menu5
二、腳本中使用zenity
zenity不遵照dialog和kdialog中使用的選項特定,所以將任何現有的交互式腳本轉換爲zenity都具備挑戰性;
#!/bin/bash # using zenity to create a menu temp=`mktemp -t temp.XXXXXX` temp2=`mktemp -t temp2.XXXXXX` function diskspace { df -k > $temp zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 10 } function whoseon { who > $temp zenity --text-info --title "Logged in user" --filename=$temp --width 500 --height 10 } function memusage { cat /proc/meminfo > $temp zenity --text-info --title "Memory usage" --filename=$temp --with 300 --height 500 } while [ 1 ] do zenity --list --radiolist --title "Sys Admin Menu" --column "Select" --column "Menu Item" FALSE "Display disk space" FALSE "Display users" FALSE "Disyplay memory usage" FALSE "Exit" > $temp2 if [ $? -eq 1 ] then break fi selection=`cat $temp2` case $selection in "Display disk space") diskspace ;; "Display users") whoseon ;; "Display memory usage") memusage ;; Exit) break ;; *) zenity --info "Sorry, invalid selection" exac done