第一部分:Linux命令行
《Linux命令行與shell腳本編程大全》 第一章:初識Linux shell
《Linux命令行與shell腳本編程大全》 第二章:走進shell
《Linux命令行與shell腳本編程大全》 第三章:基本的bash shell命令
《Linux命令行與shell腳本編程大全》 第四章:更多的bash shell命令
《Linux命令行與shell腳本編程大全》 第五章:使用Linux環境變量
《Linux命令行與shell腳本編程大全》 第六章:理解Linux文件權限
《Linux命令行與shell腳本編程大全》 第七章:管理文件系統
《Linux命令行與shell腳本編程大全》 第八章:安裝軟件程序
《Linux命令行與shell腳本編程大全》 第九章:使用編輯器
第二部分:shell腳本編程基礎
《Linux命令行與shell腳本編程大全》 第十章:構建基本腳本
《Linux命令行與shell腳本編程大全》 第十一章:使用結構化命令
《Linux命令行與shell腳本編程大全》 第十二章:更多的結構化命令
《Linux命令行與shell腳本編程大全》 第十三章:處理用戶輸入
《Linux命令行與shell腳本編程大全》 第十四章:呈現數據
《Linux命令行與shell腳本編程大全》 第十五章:控制腳本
第三部分:高級shell編程
《Linux命令行與shell腳本編程大全》 第十六章:創建函數
《Linux命令行與shell腳本編程大全》 第十七章:圖形化桌面上的腳本編程
《Linux命令行與shell腳本編程大全》 第十八章:初識sed和gawk
《Linux命令行與shell腳本編程大全》 第十九章:正則表達式
《Linux命令行與shell腳本編程大全》 第二十章:sed進階
《Linux命令行與shell腳本編程大全》 第二十一章:gawk進階
《Linux命令行與shell腳本編程大全》 第二十二章:使用其他shell
第四部分:高級shell腳本編程主題
《Linux命令行與shell腳本編程大全》 第二十三章:使用數據庫
《Linux命令行與shell腳本編程大全》 第二十四章:使用Web
《Linux命令行與shell腳本編程大全》 第二十五章:使用E-mail
《Linux命令行與shell腳本編程大全》 第二十六章:編寫腳本實用工具
《Linux命令行與shell腳本編程大全》 第二十七章:shell腳本編程進階
第十七章:圖形化桌面上的腳本編程
創建文本菜單
創建菜單佈局
#!/bin/bash
clear #清屏
echo -e "\t\tMenu"
echo -e "1.\tDisplay disk space"
echo -e "2.\tDisplay logged on user"
echo -e "3.\tDisplay memory usage"
echo -e "0.\tExit menu\n\n"
echo -en "\t\tEnter option:" #-n表示不打印回車
read -n1 option #讀取一個字符
echo ""
顯示效果:
Menu
1. Display disk space
2. Display logged on user
3. Display memory usage
0. Exit menu
Enter option:
創建菜單函數
只需把上面的代碼用函數包起來即可
添加菜單邏輯
#!/bin/bash
option=""
create_menu(){
clear
echo -e "\t\tMenu"
echo -e "1.\tDisplay disk space"
echo -e "2.\tDisplay logged on user"
echo -e "3.\tDisplay memory usage"
echo -e "0.\tExit menu\n\n"
echo -en "\t\tEnter option:"
read -n1 option
echo ""
}
create_menu
case $option in
0)
echo "Display disk space";;
1)
echo "Display logged on user";;
2)
echo "Display memory usage";;
3)
echo "Exit menu";;
*)
echo "error";;
esac
添加對應的case即可,之後,我們再來實現相應的函數。
整合shell腳本菜單
首先添加case相應的實現函數
disk_space(){
clear
df -k
}
whoseon(){
clear
who
}
menu_usage(){
clear
cat /proc/meminfo
}
之後處理case部分
deal_menu(){
case $option in
1)
disk_space;;
2)
whoseon;;
3)
menu_usage;;
0)
echo "Exit menu";;
*) #輸入錯誤,重新輸入
echo -e "\nSorry, wrong selection."
echo -en "\n\n\t\tHit any key to continue."
read -n1 option #重新讀取菜單選項
deal_menu;;
esac
}
deal_menu
使用select命令
select命令允許從單個命令行創建菜單,然後再提取輸入的答案並自動處理。
select variable in list
do
commands
done
list參數是構成菜單的空格分割的文本選項列表。
select命令會在列表中將每個選項作爲一個編好號的選項顯示,然後爲選項顯示一個特殊的由PS3環境變量定義的提示符。(默認的提示符爲#?)
PS3="Enter option:"
select option in "Display disk space" "Display logged on user" "Display memory usage" "Exit menu"
do
case $option in
"Display disk space")
disk_space;;
"Display logged on user")
whoseon;;
"Display memory usage")
menu_usage;;
"Exit menu")
echo "Exit menu"
break;;
*)
echo -e "\nSorry, wrong selection."
echo -en "\n\n\t\tHit any key to continue."
read -n1 option
deal_menu;;
esac
done
運行結果:
$ menu_test
1) Display disk space 3) Display memory usage
2) Display logged on user 4) Exit menu
Enter option:
select會自動生成菜單
注意:存儲在變量中的結果是整個字符串,不是菜單選項前面的數字
使用窗口
安裝dialog:sudo apt-get install dialog
dialog包
dialog部件
部件 | 描述 |
calendar | 提供選擇日期的日曆 |
checklist | 顯示多個選項(其中每一個選項都能打開或關閉) |
from | 構建一個表單(用標籤和文本字段來填充) |
fselect | 提供一個文件選擇窗口來瀏覽選擇文件 |
gauge | 顯示完成的百分比進度條 |
infobox | 顯示一條消息,但不用等待迴應 |
inputbox | 提供一個輸入文本用的文本表單 |
inputmenu | 提供一個可編輯的菜單 |
menu | 顯示可選擇的一些列選項 |
msgbox | 顯示一條消息,並要求用戶選擇OK按鈕 |
pause | 顯示一個進度條來顯示特定暫定時間的狀態 |
passwordbox | 顯示一個文本框來輸入文本,但會隱藏輸入的文本 |
passwordform | 顯示一個帶標籤和隱藏文本輸入的表單 |
radiolist | 提供一組菜單選項,但只能選擇其中一個 |
tailbox | 用tail命令在滾動窗口中顯示文件的內容 |
tailboxbg | 跟tailbox一樣,但是在後臺模式中運行 |
textbox | 在滾動窗口中顯示文件的內容 |
timebox | 提供一個選擇小時、分鐘和秒數的窗口 |
yesno | 提供一條簡單的帶Yes和No按鈕的消息 |
dialog --widget parameters
widget是上面的部件,parameters是部件窗口大小、所需文本等
每個dialog部件都提供兩種格式的輸出:
使用STDERR
使用退出狀態碼
用戶選擇的按鈕決定了dialog命令的退出狀態碼。如果選擇Yes、OK,dialog命令會返回退出狀態碼0。如果選擇了Cancel、NO,dialog命令會返回退出狀態碼1
可以用標準的$?變量來查看退出狀態碼
如果部件返回了任何數據,那麼dialog命令會將數據發送到STDERR
msgbox部件
dialog --msgbox text height width
可以指定title
dialog --title Testing --msgbox "This is a test" 10 20
yesno部件
dialog --title "Do not lie to me" --yesno "Are you a girl?" 10 20
inputbox部件
dialog --title "Do not lie to me" --inputbox "Enter you age:" 10 20 2>age.txt
textbox部件
dialog --textbox /etc/passwd 15 45
可以顯示大量文本,並且可以用方向鍵、Home、End、PgUp、PgDn等操作
menu部件
dialog --menu "Menu" 20 30 5 1 "A." 2 "B." 3 "C."
上面紅色的參數表示菜單欄的高度爲5個item高,前面兩個參數是dialog的高和寬
fselect部件
dialog --title "select a file" --fselect /etc/ 10 50 2>file.txt
dialog選項
選項 | 描述 |
--add-widget | 繼續下個對話框,直到按下Esc或者Cancel |
--aspect ratio | 指定窗口寬度和高度的寬高比 |
--backtitle title | 指定顯示在屏幕頂部背景上的標題(2) |
--begin x y | 指定窗口左上角的起始位置 |
--cancel-label label | 指定Cancel按鈕的替代標籤 |
--clear | 用默認對話背景色來清空顯示 |
--colors | 在對話框文本中嵌入ANSI色彩編碼 |
--cr-wrap | 在對話文本中允許使用換行符並強制換行 |
--create-rc file | 將示例配置文件的內容複製到指定的file文件中(1) |
--defaultno | 將yes/no對話的默認答案設置爲no |
--default-item string | 設定複選列表,表單或菜單對話中的默認項 |
--exit-label label | 指定Exit按鈕的替代標籤 |
--extra-button | 在OK按鈕和Cancel按鈕中顯示一個額外按鈕 |
--extra-label label | 指定額外按鈕的替代標籤 |
--help | 顯示dialog命令的幫助信息 |
--help-button | 在OK按鈕和Cancel按鈕後顯示一個Help按鈕 |
--help-label label | 指定Help按鈕的替代標籤 |
--help-status | 當選定Help按鈕時,會在幫助信息後寫入多選列表、單選列表或表單信息 |
--ignore | 忽略dialog不能識別的選項 |
--input-fd fd | 指定另一個文件描述符,而不是STDIN |
--insecure | 在password部件中鍵入時顯示星號 |
--item-help | 爲多選列表,單選列表或菜單中的每個標號在屏幕的底部添加一個幫助欄 |
--keep-window | 不要清除屏幕上顯示過的部件 |
--max-input size | 指定輸入的最大字符長度。默認爲2048 |
--nocancel | 隱藏Cancel按鈕 |
--no-collapse | 在對話文本中不要將製表符轉換成空格 |
--no-kill | 將tailboxbg對話放到後臺,並禁止該進程的SIGHUP信號 |
--no-label label | 爲No按鈕指定替代標籤 |
--no-shadow | 不要顯示對話窗口的投影效果 |
--ok-label label | 指定OK按鈕的替代標籤 |
--output-fd fd | 指定另一個輸出文件描述符,而不是STDERR |
--print-maxsize | 將對話窗口的最大尺寸打印到輸出中 |
--print-size | 將每個對話窗口的大小打印到輸出中 |
--print-version | 將dialog的版本打印到輸出中 |
--separate-output | 一次一行地輸出checklist部件的結果而不用引號 |
--separator string | 爲每個部件指定分割輸出的字符串 |
--separate-widget string | 爲每個部件指定分割輸出的字符串 |
--shadow | 在每個窗口的右下角繪製陰影 |
--single-quoted | 需要時對多選列表的輸出採用單引號 |
--sleep sec | 在處理完對話窗口之後延遲指定的秒數 |
--stderr | 將輸出發送到STDERR(默認即是如此) |
--stdout | 將輸出發送到STDOUT |
--tab-correct | 將製表符轉換成空格 |
--tab-len n | 指定一個製表符佔用的空格數(默認爲8) |
--timeout sec | 指定無用戶輸入的話,sec秒後退出並返回錯誤代碼 |
--title title | 指定對話窗口的標題 |
--trim | 從對話文本中刪除前面是空格和換行符 |
--visit-items | 修改對話窗口中的製表符的停留位置,使其包括選項列表 |
--yes-label label | 爲Yes按鈕執行替代標籤 |
(1)dialog命令支持運行時配置。dialog啓動時先去檢查是否設置了DIALOGRC環境變量,該變量保存配置文件路徑。
如果沒有找到,則使用$HOME/.dialogrc。如果這個也不存在,就嘗查找編譯時指定的GLOBALRC(/etc/dialogrc),如果這個也不存在,就用編譯默認值。
(2)--backtitle選項是爲了腳本中的菜單創建公共標題的簡便辦法。如果給每個對話窗口都指定了該選項,那麼它在應用中將保持一致。
在腳本中使用dialog命令
這裏需要注意兩點:
1.如果有Cancel或者No按鈕,檢查dialog命令的退出狀態碼
2.重定向STDERR來獲得輸出值
下面是將之前的代碼改用dialog實現
#!/bin/bash
temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`
disk_space(){
df -k > $temp
dialog --textbox $temp 20 60
}
whoseon(){
who > $temp
dialog --textbox $temp 20 50
}
menu_usage(){
cat /proc/meminfo > $temp
dialog --textbox $temp 20 50
}
dialog --menu "menu" 20 30 10 1 "Display disk space" 2 "Display logged on user" 3 "Display memory usage" 0 "Exit menu" 2>$temp2
if [ $? -ne 1 ]
then
selection=`cat $temp2`
case $selection in
1)
disk_space;;
2)
whoseon;;
3)
menu_usage;;
0) ;;
*)
dialog --msgbox "Sorry, invalid selection" 10 30
esac
fi
rm -f $temp $temp2 2>/dev/null
使用圖形
KDE環境
安裝kdialog
sudo apt-get install kdebase-bin
kdialog部件
和dialog類似,命令格式爲:
kdialog display-options window-options arguments
window-options選項允許指定使用那種類型的窗口。
kdialog窗口選項
選項 | 描述 |
--checklist title [tag item status] | 多選列表菜單,狀態會說明該選項是否被選定 |
--error text | 錯誤消息框 |
--inputbox text [init] | 輸入文本框。可以用init指定默認值 |
--menu title [tag item] | 帶有標題的菜單選擇框,以及用tag標識的選項列表 |
--msgbox text | 顯示指定文件的簡單消息框 |
--password text | 隱藏用戶輸入的密碼輸入文本框 |
--radiolist title [tag item status] | 單選列表菜單,狀態會說明該選項是否被選定 |
--separate-output | 爲多選列表和單選列表菜單返回按行分開的選項 |
--sorry text | “抱歉”消息框 |
--textbox file [width] [height] | 顯示file的內容的文本框,另外指定了width和height |
--title title | 爲對話窗口的TitleBar區域指定一個標題 |
--warningyesno text | 帶有Yes和No按鈕的警告消息框 |
--warningcontinuecancel text | 帶有Continue和Cancel按鈕的警告消息框 |
--warningyesnocancel text | 帶有Yes、No和Cancel按鈕的警告消息框 |
--yesno text | 帶有Yes和No按鈕的提問框 |
--yesnocancel text | 帶有Yes、No和Cancel按鈕的提問框 |
checklist和radiolist允許你在列表中定義單獨的選項以及他們默認是否選定
使用kdialog
kdialog與dialog最大的不同就是kdialog將輸出重定向到了STDOUT中。
GNOME環境
zenity部件
zenity窗口部件
選項 | 描述 |
--calendar | 顯示整月日曆 |
--entry | 顯示文本輸入對話窗口 |
--error | 顯示錯誤消息對話窗口 |
--file-selection | 顯示完整的路徑名和文件名對話窗口 |
--info | 顯示信息對話窗口 |
--list | 顯示多選列表或單選列表對話窗口 |
--notification | 顯示通知圖標 |
--process | 顯示進度條對話窗口 |
--question | 顯示yes/no對話窗口 |
--scale | 顯示可調整大小的窗口 |
--text-info | 顯示含有文本的文本框 |
--warning | 顯示警告對話窗口 |
zenity提供的窗口就比之前的dialog效果好多了
zenity --calendar
當選擇了日期之後,zenity會將值返回到STDOUT中,和kdialog一樣
在腳本中使用zenity
#!/bin/bash
temp=`mktemp -t temp.XXXXXX`
temp2=`mktemp -t temp2.XXXXXX`
disk_space(){
df -k > $temp
zenity --text-info --title "Disk space" --filename=$temp --width 750 --height 300
}
whoseon(){
who > $temp
zenity --text-info --title "Logged on user" --filename=$temp --width 500 --height 200
}
menu_usage(){
cat /proc/meminfo > $temp
zenity --text-info --title "Memory usage" --filename=$temp --width 300 --height 500
}
zenity --list --radiolist --title "Menu" --column "Select" \
--column "Menu Item" FALSE "Display disk space" FALSE "Display logged on user" FALSE "Display memory usage" FALSE "Exit" > $temp2
if [ $? -ne 1 ]
then
selection=`cat $temp2`
case $selection in
"Display disk space")
disk_space;;
"Display logged on user")
whoseon;;
"Display memory usage")
menu_usage;;
"Exit") ;;
*)
zenity --info "Sorry. invalid selection."
esac
fi
rm -f $temp $temp2 2>/dev/null
zenity不支持菜單對話框
轉貼請保留以下鏈接
本人blog地址