核心是case命令,根據(jù)用戶(hù)的選擇來(lái)執(zhí)行特定的命令。
創(chuàng)新互聯(lián)建站是網(wǎng)站建設(shè)專(zhuān)家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營(yíng)銷(xiāo),專(zhuān)業(yè)領(lǐng)域包括成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、電商網(wǎng)站制作開(kāi)發(fā)、小程序開(kāi)發(fā)、微信營(yíng)銷(xiāo)、系統(tǒng)平臺(tái)開(kāi)發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開(kāi)發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營(yíng)銷(xiāo)的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評(píng)估并優(yōu)化我們的方案,為客戶(hù)提供全方位的互聯(lián)網(wǎng)品牌整合方案!
使用echo命令打印字符,生成一個(gè)菜單,還可以包括標(biāo)題等信息:
clear
echo
# -e 選項(xiàng),打印特殊字符
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"
# -en 會(huì)去掉末尾的換行符,光標(biāo)會(huì)留在行尾
echo -en "\t\tEnter option: "
# 獲取用戶(hù)輸入,只期望獲取到單個(gè)字符,-n選擇限制只讀1個(gè)字符,并且用戶(hù)不用回車(chē)
read -n 1 option
clear命令,先清空當(dāng)前會(huì)話(huà)的內(nèi)容。
echo -e選項(xiàng),可以打印特殊字符。
echo -en選項(xiàng),會(huì)去掉末尾的換行符。這讓菜單看上去更專(zhuān)業(yè),光標(biāo)會(huì)一直行尾等待用戶(hù)輸入。
獲取用戶(hù)輸入
打印出菜單后,就要等待并獲取用戶(hù)輸入。這步使用read命令。這里期望只要單個(gè)字符,所以用 -n 選項(xiàng)限制只讀取一個(gè)字符。這樣用戶(hù)只需要輸入一個(gè)數(shù)字,并且不用按回車(chē)。
創(chuàng)建菜單函數(shù)
把上面的部分封裝成一個(gè)函數(shù),這樣,在任何時(shí)候只要調(diào)用函數(shù),就能重現(xiàn)菜單。
樁函數(shù)(stub function),是一個(gè)空函數(shù),或者只有一個(gè)echo語(yǔ)句,說(shuō)明最終這里需要什么內(nèi)容:
function diskspace {
clear
echo "Display disk space"
}
這樣,就不需要事先寫(xiě)出所有函數(shù)。菜單能夠直接投入使用,之后在來(lái)實(shí)現(xiàn)具體的操作。
菜單布局和函數(shù)都有了,下面需要?jiǎng)?chuàng)建程序邏輯將二者結(jié)合起來(lái)。這里就需要case命令。
case命令根據(jù)菜單中輸入的字符來(lái)調(diào)用相應(yīng)的函數(shù)。用默認(rèn)的case命令字符星號(hào)來(lái)處理所有不正確的菜單項(xiàng)。
下面就是這個(gè)完整的菜單腳本的例子:
#!/bin/bash
# 為腳本創(chuàng)建文本菜單
# --------------------
# 定義函數(shù)
# --------------------
# 打印菜單
function menu {
clear
echo
# -e 選項(xiàng),打印特殊字符
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"
# -en 會(huì)去掉末尾的換行符,光標(biāo)會(huì)留在行尾
echo -en "\t\tEnter option: "
# 獲取用戶(hù)輸入,只期望獲取到單個(gè)字符,-n選擇限制只讀1個(gè)字符,并且用戶(hù)不用回車(chē)
read -n 1 option
}
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function menusage {
clear
cat /proc/meminfo
}
# --------------------
# 函數(shù)主體
# --------------------
while [ 1 ]
do
# 菜單邏輯
menu
case $option in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
menusage ;;
*)
clear
echo "Wrong selection";;
esac
echo -en "\n\n\t\tHit any key to continue"
read -n 1 line
done
clear
菜單的顯示效果如下:
Sys Admin Menu
1. Display disk space
2. Display logged on users
3. Display memory usage
0. Exit program
Enter option:
創(chuàng)建文本菜單的過(guò)程中,花了一半的精力在建立菜單布局和獲取用戶(hù)輸入上。bash shell 提供了一個(gè)很容易上手的小工具,可以幫助自動(dòng)完成這些工作。
select命令只需要一條命令就可以創(chuàng)建出菜單,然后獲取輸入并自動(dòng)處理。命令格式如下:
select 選項(xiàng)變量 in "選項(xiàng)1" "選項(xiàng)2" "選項(xiàng)3"
do
命令
done
select命令會(huì)將每個(gè)選項(xiàng)自動(dòng)加上編號(hào),然后為選項(xiàng)顯示一個(gè)由PS3環(huán)境變量定義的特殊提示符。所以還要定義PS3環(huán)境變量。
這里是一個(gè)select命令的示例:
#!/bin/bash
# 為腳本創(chuàng)建文本菜單
function diskspace {
clear
df -k
}
function whoseon {
clear
who
}
function menusage {
clear
cat /proc/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")
menusage ;;
*)
clear
echo "Wrong selection";;
esac
done
菜單效果如下:
$ menu2.sh
1) Display disk space 3) Display memory usage
2) Display logged on users 4) Exit program
Enter option:
使用這個(gè)工具可以快速的創(chuàng)建一個(gè)簡(jiǎn)易的菜單,不過(guò)視覺(jué)效果就差很多。
dialog包能夠用ANSI轉(zhuǎn)義控制字符在文本環(huán)境中創(chuàng)建標(biāo)準(zhǔn)的窗口對(duì)話(huà)框。
dialog包提供了很多窗口部件(widget),使用的時(shí)候命令格式如下:
dialog --widget parameters
常用的部件如下:
更多窗口部件,后面會(huì)詳細(xì)列出。
每個(gè)dialog部件都提供了兩種形式的輸出:
返回選項(xiàng)
如果選擇了YES或OK,返回退出狀態(tài)碼0。如果選擇了Cancel或No,返回退出狀態(tài)碼1。可以用標(biāo)準(zhǔn)的$?變量來(lái)判斷具體選擇了哪個(gè)按鈕。
返回?cái)?shù)據(jù)
如果是返回?cái)?shù)據(jù),則會(huì)將數(shù)據(jù)發(fā)送到STDERR??梢杂脴?biāo)準(zhǔn)的bash shell方法來(lái)將STDERR輸出重定向到另一個(gè)文件或文件描述符中:
dialog --inputbox "Enter your age: " 10 20 2>age.txt
具體怎么用可以參考下面的示例。
內(nèi)容比較多,感覺(jué)也不一定需要制作這么好的窗口來(lái)交換。編寫(xiě)腳本時(shí)記住兩件事:
前面的例子使用dialog包實(shí)現(xiàn)的示例代碼:
#!/bin/bash
# 為腳本創(chuàng)建文本窗口菜單
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 menusage {
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 logged on users" \
3 "Display memory usage" \
0 "Exit program" 2> $temp2
if [ $? -eq 1 ]
then
break
fi
selection=$(cat $temp2)
case $selection in
0)
break ;;
1)
diskspace ;;
2)
whoseon ;;
3)
menusage ;;
*)
dialog --msgbox "Wrong selection" 10 30
esac
done
rm -f $temp 2> /dev/null
rm -f $temp2 2> /dev/null
這里用到了臨時(shí)文件,并且使用mktemp命令來(lái)創(chuàng)建臨時(shí)文件,看著挺專(zhuān)業(yè)。
另外系統(tǒng)可能默認(rèn)沒(méi)有安裝dialog包,要運(yùn)行這個(gè)腳本,需要先安裝dialog包:
[root@Ansible ~]# yum info dialog
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
已安裝的軟件包
名稱(chēng) :dialog
架構(gòu) :x86_64
版本 :1.2
發(fā)布 :5.20130523.el7
大小 :505 k
源 :installed
來(lái)自源:base
簡(jiǎn)介 : A utility for creating TTY dialog boxes
網(wǎng)址 :http://invisible-island.net/dialog/dialog.html
協(xié)議 : LGPLv2
描述 : Dialog is a utility that allows you to show dialog boxes (containing
: questions or messages) in TTY (text mode) interfaces. Dialog is called
: from within a shell script. The following dialog boxes are implemented:
: yes/no, menu, input, message, text, info, checklist, radiolist, and
: gauge.
:
: Install dialog if you would like to create TTY dialog boxes.
dialog部件
部件 | 描述 |
---|---|
calendar | 提供選擇日期的日歷 |
checklist | 顯示多個(gè)選項(xiàng)(其中每個(gè)選項(xiàng)都能打開(kāi)或關(guān)閉) |
form | 構(gòu)建一個(gè)帶有標(biāo)簽及文本字段(可以填內(nèi)容)的表單 |
fselect | 提供一個(gè)文件選擇窗口來(lái)瀏覽選擇文件 |
gauge | 顯示完成的百分比進(jìn)度條 |
infobox | 顯示一條消息,但不用等待回應(yīng) |
inputbox | 提供一個(gè)輸入文本用的文本表單 |
inputmenu | 提供一個(gè)可編輯的菜單 |
menu | 顯示可選擇的一系列選項(xiàng) |
msgbox | 顯示一條消息,并要求用戶(hù)選擇OK按鈕 |
pause | 顯示一個(gè)進(jìn)度條來(lái)顯示暫停期間的狀態(tài) |
passwordbox | 顯示一個(gè)文本框,但會(huì)隱藏輸入的文本 |
passwordform | x牧場(chǎng)一個(gè)帶標(biāo)簽和隱藏文本字段的表單 |
radiolist | 提供一組菜單選項(xiàng),單只能選擇其中一個(gè)。就是單選 |
tailbox | 用tail命令在滾動(dòng)窗口中顯示文件的內(nèi)容 |
tailboxbg | 更tailbox一樣,但是在后臺(tái)模式中運(yùn)行 |
textbox | 在滾動(dòng)窗口中顯示文件的內(nèi)容 |
timebox | 提供一個(gè)選擇小時(shí)、分鐘和秒的窗口 |
yesno | 提供一條帶有Yes和No按鈕的簡(jiǎn)單消息 |
除了標(biāo)準(zhǔn)部件,還可以在dialog命令中定制不同的選項(xiàng)。這些選項(xiàng)可以讓你全面定制窗口外觀和操作。
dialog命令選項(xiàng)
選項(xiàng) | 描述 |
---|---|
--add-widget | 繼續(xù)下個(gè)對(duì)話(huà)框,直到按下Esc或Cancel按鈕 |
--aspect ratio | 指定窗口寬度和高度的寬高比 |
--backtitle title | 指定顯示在屏幕頂部背景上的標(biāo)題 |
--begin x y | 指定窗口左上角的起始位置 |
--clear | 用默認(rèn)的對(duì)話(huà)背景色來(lái)清空屏幕內(nèi)容 |
--colors | 在對(duì)話(huà)文本中嵌入ANSI色彩編碼 |
--cr-wrap | 在對(duì)話(huà)文本中允許使用換行符并強(qiáng)制換行 |
--create-rc file | 將示例配置文件的內(nèi)容復(fù)制到指定的file文件中 |
--default-item string | 設(shè)定復(fù)選列表、表單或菜單對(duì)話(huà)中的默認(rèn)項(xiàng) |
--help | 顯示dialog命令的幫助信息 |
--help-status | 當(dāng)選定Help按鈕后,在幫助信息后寫(xiě)入多選列表、單選列表或表單信息 |
--ignore | 忽略dialog不能識(shí)別的選項(xiàng) |
--input-fd fd | 指定STDIN之外的另一個(gè)文件描述符 |
--insecure | 在password部件中鍵入內(nèi)容時(shí)顯示星號(hào) |
--item-help | 為多選列表、單選列表或菜單中的每個(gè)標(biāo)號(hào)在屏幕底部添加一個(gè)幫助欄 |
--keep-window | 不要清除屏幕上顯示過(guò)的部件 |
--max-input size | 指定輸入的最大字符串長(zhǎng)度。默認(rèn)為2048 |
--no-collapse | 不要將對(duì)話(huà)文本中的制表符轉(zhuǎn)換成空格 |
--no-kill | 將tailbox對(duì)話(huà)框放到后臺(tái),并禁止該進(jìn)程的SIGHUP信號(hào) |
--no-shadow | 不要顯示對(duì)話(huà)窗口的陰影效果 |
--output-fd fd | 指定除STDERR之外的另一個(gè)輸出文件描述符 |
--print-maxsize | 將對(duì)話(huà)窗口的最大尺寸打印到輸出中 |
--print-size | 將對(duì)話(huà)窗口的大小尺寸打印到輸出中 |
--print-version | 將dialog版本號(hào)打印到輸出中 |
--separate-output | 一次一行地輸出checklist部件的結(jié)果,不使用引號(hào) |
--separator string | 指定用于分隔部件輸出的字符串 |
--separate-widget string | 指定用于分隔部件輸出的字符串 |
--shadow | 在每個(gè)窗口的右下角繪制陰影 |
--single-quoted | 需要時(shí)對(duì)多選列表的輸出采用單引號(hào) |
--sleep sec | 在處理完對(duì)話(huà)窗口之后延遲指定的秒數(shù) |
--stderr | 將輸出發(fā)送到STDERR(默認(rèn)行為) |
--stdout | 將輸出發(fā)送到STDOUT |
--tab-correct | 將制表符轉(zhuǎn)換成空格 |
--tab-len n | 指定一個(gè)制表符占用的空格數(shù)(默認(rèn)為8) |
--timeout sec | 指定無(wú)用戶(hù)輸入時(shí),sec秒后退出并返回錯(cuò)誤代碼 |
--titel title | 指定對(duì)話(huà)窗口的標(biāo)題 |
--trim | 從對(duì)話(huà)文本中刪除前導(dǎo)空格和換行符 |
--visit-items | 修改對(duì)話(huà)窗口中制表符的停留位置,使其包括選項(xiàng)列表 |
dialog命令選項(xiàng)2
按鈕的選項(xiàng)功能都差不多,單獨(dú)列出在這里??梢灾貙?xiě)對(duì)話(huà)窗口中的任意按鈕標(biāo)簽:
選項(xiàng) | 描述 |
---|---|
--cancel-label label | 指定Cancel按鈕的替代標(biāo)簽 |
--defaultno | 將yes/no對(duì)話(huà)框的默認(rèn)答案設(shè)為No |
--exit-label label | 指定Exit按鈕的替代標(biāo)簽 |
--extra-button | 在OK按鈕和Cancel按鈕之間顯示一個(gè)額外按鈕 |
--extra-label label | 指定額外按鈕的替代標(biāo)簽 |
--help-button | 在OK按鈕和Cancel按鈕后顯示一個(gè)Help按鈕 |
--help-label label | 指定Help按鈕的替代標(biāo)簽 |
--nocancel | 隱藏Cancel按鈕 |
--no-lable label | 為No按鈕指定替代標(biāo)簽 |
--ok-label label | 指定OK按鈕的替代標(biāo)簽 |
--yes-label label | 為Yes按鈕指定替代標(biāo)簽 |
舉例說(shuō)明
在需要臨時(shí)將內(nèi)容保存到文件的時(shí)候,有個(gè)特殊命令可以用來(lái)創(chuàng)建臨時(shí)文件。mktemp命令可以在/tmp目錄中創(chuàng)建一個(gè)唯一的臨時(shí)文件。shell會(huì)創(chuàng)建這個(gè)文件,但不用默認(rèn)的umask值。它會(huì)將當(dāng)前用戶(hù)設(shè)置為文件的屬主,并且只有屬主有讀寫(xiě)權(quán)限。
默認(rèn)情況下,mktemp會(huì)在當(dāng)前目錄中創(chuàng)建一個(gè)文件。使用命令的時(shí)候,需要指定一個(gè)文件名模板。模板可以包含任意文本文件名,在文件名末尾加上6個(gè)X(幾個(gè)X都沒(méi)關(guān)系,書(shū)上建議6位):
$ mktemp test1.XXXXXX
test1.Acrugq
$ ls -al test1*
-rw-------. 1 steed steed 0 12月 12 14:26 test1.Acrugq
$
mktemp命令會(huì)用6位字符碼替換這6個(gè)X,從而保證文件名在目錄中是唯一的。
在腳本中使用mktemp命令時(shí),需要將文件名保存到變量中,這樣就能在后面的腳本中引用了:
$ mktemp test2.XXXXXX
test2.leOFBZ
$ mktemp test2.XXXXXX
test2.5kDbKn
$ mktemp test2.XXXXXX
test2.domeOC
$ mktemp test2.XXXXXX
test2.CJX702
$ tempfile=$(mktemp test2.XXXXXX)
$ exec 3>>$tempfile
$ echo "test2 Line1" >&3
$ echo "TEST2 LINE2" >&3
$ exec 3>&-
$ cat $tempfile
test2 Line1
TEST2 LINE2
$ ls -al test2*
-rw-------. 1 steed steed 0 12月 12 14:41 test2.5kDbKn
-rw-------. 1 steed steed 0 12月 12 14:41 test2.CJX702
-rw-------. 1 steed steed 0 12月 12 14:41 test2.domeOC
-rw-------. 1 steed steed 0 12月 12 14:41 test2.leOFBZ
-rw-------. 1 steed steed 24 12月 12 14:41 test2.tMVTwN
$ rm -f $tempfile 2> /dev/null
$ ls -al test2*
-rw-------. 1 steed steed 0 12月 12 14:41 test2.5kDbKn
-rw-------. 1 steed steed 0 12月 12 14:41 test2.CJX702
-rw-------. 1 steed steed 0 12月 12 14:41 test2.domeOC
-rw-------. 1 steed steed 0 12月 12 14:41 test2.leOFBZ
$
這里先創(chuàng)建了幾個(gè)臨時(shí)文件,干擾一下。使用的時(shí)候,創(chuàng)建了文件描述符3來(lái)使用,使用完之后關(guān)閉了文件描述符。最后精確的把用完的臨時(shí)文件給刪除了。
-t選項(xiàng)會(huì)強(qiáng)制mktemp命令在系統(tǒng)的臨時(shí)目錄創(chuàng)建文件。此時(shí)返回的就是創(chuàng)建的文件的全路徑:
$ mktemp -t test3.XXXXXX
/tmp/test3.aPIXIy
$
-d選項(xiàng)則是創(chuàng)建一個(gè)臨時(shí)目錄。如果要在/tmp目錄下創(chuàng)建臨時(shí)目錄,就是-dt:
$ mktemp -d dir.XXXXXX
dir.aBDmsd
$ mktemp -dt dir.XXXXXX
/tmp/dir.pqW927
$
當(dāng)前名稱(chēng):shell創(chuàng)建文本菜單
分享鏈接:http://aaarwkj.com/article18/pjcdgp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、外貿(mào)建站、電子商務(wù)、網(wǎng)站收錄、ChatGPT、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)