欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

shell創(chuàng)建文本菜單

創(chuàng)建文本菜單

核心是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)品牌整合方案!

創(chuà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)菜單。

創(chuàng)建樁函數(shù)

樁函數(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: 

使用 select 命令

創(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包)

dialog包能夠用ANSI轉(zhuǎn)義控制字符在文本環(huán)境中創(chuàng)建標(biāo)準(zhǔn)的窗口對(duì)話(huà)框。

窗口部件

dialog包提供了很多窗口部件(widget),使用的時(shí)候命令格式如下:

dialog --widget parameters

常用的部件如下:

  1. msgbox部件:在窗口中顯示一條簡(jiǎn)單的消息,會(huì)有一個(gè)OK按鈕
  2. yesno部件:允許用戶(hù)對(duì)窗口中顯示的問(wèn)題選擇yes或no,會(huì)有兩個(gè)按鈕
  3. inputbox部件:提供一個(gè)簡(jiǎn)單的文本框區(qū)域來(lái)輸入文本
  4. textbox部件:可以在窗口中顯示大量信息,會(huì)生成一個(gè)滾動(dòng)窗口
  5. menu部件:創(chuàng)建文本菜單,需要為每個(gè)選項(xiàng)提供一個(gè)選擇標(biāo)號(hào)和顯示文本
  6. fselect部件:可以用來(lái)瀏覽文件和文件夾

更多窗口部件,后面會(huì)詳細(xì)列出。

獲取部件的輸出

每個(gè)dialog部件都提供了兩種形式的輸出:

  • 使用退出狀態(tài)碼
  • 使用STDERR

返回選項(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命令的退出狀態(tài)碼
  • 否則就重定向STDERR來(lái)獲取輸出的值

前面的例子使用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è)。

安裝dialog包

另外系統(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部件詳表

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)單消息

dialog選項(xiàng)

除了標(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ō)明

  • --title選項(xiàng),允許你設(shè)置出現(xiàn)在窗口頂部的部件標(biāo)題。
  • --backtitle選項(xiàng),是為腳本中的菜單創(chuàng)建公共標(biāo)題的簡(jiǎn)便辦法。
  • --create-rc選項(xiàng),dialog命令支持運(yùn)行時(shí)配置。該命令會(huì)根據(jù)配置文件模板創(chuàng)建一份配置文件。

創(chuàng)建本地臨時(shí)文件(mktemp)

在需要臨時(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)限。

創(chuàng)建文件

默認(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í)文件給刪除了。

在/tmp目錄創(chuàng)建臨時(shí)文件

-t選項(xiàng)會(huì)強(qiáng)制mktemp命令在系統(tǒng)的臨時(shí)目錄創(chuàng)建文件。此時(shí)返回的就是創(chuàng)建的文件的全路徑:

$ mktemp -t test3.XXXXXX
/tmp/test3.aPIXIy
$ 

創(chuàng)建臨時(shí)目錄

-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)

微信小程序開(kāi)發(fā)
国产一区二区黄色网页| 国产亚洲欧美成人精品久久| 亚洲av成人av天堂| 午夜精品久久99蜜桃| 成人爱爱免费观看视频| 亚洲一区二区三区伊人| 国产精品美女自拍视频| 国产高清白丝免费在线观看| 国产乱肥老妇国产一区二| 99热这里只有精品中文| 日韩一区二区三区四区精品| 极品丝袜美腿一区二区| 色婷婷亚洲综合色一区二区| 99人妻一区二区三区在线| 亚洲最大黄色免费在线观看| 亚洲最大色网在线观看| 久久精品一品二品三品| 亚洲精品一品区二品区三| 亚洲少妇精品视频在线| 黑人巨大精品欧美黑寡妇| 高清国产在线播放91| 国产91精品成人在线观看| 日本97久久久久久精品| 美腿丝袜清纯唯美亚洲另类| 五月爱婷婷六月爱丁香色| 视频一区二区日韩不卡| 亚洲成人高清在线视频| 亚洲成人av在线播放观看| 日日干天天日夜夜操| 中文字幕乱码在线观看一区| 日韩一日韩一区二区三电影在线观看| 日本一级特黄大片做受在线观看| 男女激情视频久久精品| 99久久成人精品国产片| 国产欧美色日韩综合在线| 国产自拍成人精品视频| 亚洲精品国产av一区二区三区 | 婷婷亚洲五月伊人91| 日本东京热加勒比视频| 在线观看男人的天堂av| 在线观看亚洲av日韩av|