国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

在Unix系統(tǒng)下用shell制作通用界面

瀏覽:9日期:2024-06-11 09:18:57

目前在Unix系統(tǒng)下用shell編寫的菜單程序大都還是采用多級(jí)菜單的模式,這種模式的弊端在于菜單的層次多,界面本身不直觀,而且在編程過程中,將菜單的顯示格式和內(nèi)容以及所調(diào)用的子程序包括在菜單主程序中,使得程序只能滿足某個(gè)方面的需求,菜單程序本身不具備通用性。本程序設(shè)計(jì)采用了一種新的設(shè)計(jì)思路,將下拉菜單界面作為二維表格來處理,把下拉菜單的內(nèi)容以及所調(diào)用的子程序名稱分別存放在這兩個(gè)二維表中,通過對表的讀取,實(shí)現(xiàn)了控制光標(biāo)移動(dòng)、選擇菜單內(nèi)容以及調(diào)用子程序的目的。采用這種方式編寫出來的程序易于維護(hù),通用性強(qiáng)。在程序本身不做任何改動(dòng)的情況下,可以在同一操作平臺(tái)中進(jìn)行任意移植,因而具有廣泛的應(yīng)用價(jià)值。這種思維模式并不局限在Unix系統(tǒng)下的shell編程,而且對于像C這樣的過程化語言也具有一定的借鑒意義。 設(shè)計(jì)思路 在下拉菜單制作過程中,整個(gè)下拉菜單界面所包含的菜單名稱以及所調(diào)用的子程序名之間的相互關(guān)系構(gòu)成了二維表,其中子菜單名稱和子程序名稱作為表的元素,通過選擇光標(biāo)在表中上下左右移動(dòng),將表中元素讀出來,再進(jìn)行處理運(yùn)算,從而達(dá)到控制菜單的選擇以及子程序調(diào)用等目的。 <BR><BR> <TABLE cellSpacing=1 cellPadding=3 align=center border=0> <TBODY> <TR bgColor=#99ccff> <TD colSpan=5><FONT class=a14>表1 菜單項(xiàng)</FONT></TD></TR> <TR bgColor=#efefef> <TD>菜單1</TD> <TD>菜單2</TD> <TD>菜單3</TD> <TD>……</TD> <TD>菜單n</TD></TR> <TR bgColor=#efefef> <TD>菜單11</TD> <TD>菜單12</TD> <TD>菜單13</TD> <TD>……</TD> <TD>菜單1n</TD></TR> <TR bgColor=#efefef> <TD>菜單21</TD> <TD>菜單22</TD> <TD>菜單23</TD> <TD> </TD> <TD>菜單2n</TD></TR> <TR bgColor=#efefef> <TD>菜單31</TD> <TD>菜單32</TD> <TD>菜單33</TD> <TD> </TD> <TD>菜單3n</TD></TR> <TR bgColor=#efefef> <TD>……</TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR bgColor=#efefef> <TD>菜單m1</TD> <TD>菜單m2</TD> <TD>菜單m3</TD> <TD> </TD> <TD>菜單mn</TD></TR></TBODY></TABLE><BR><BR> <TABLE cellSpacing=1 cellPadding=3 align=center border=0> <TBODY> <TR bgColor=#99ccff> <TD colSpan=5><FONT class=a14>表2 對應(yīng)各菜單項(xiàng)的子程序</FONT></TD></TR> <TR bgColor=#efefef> <TD>子程序11</TD> <TD>子程序12</TD> <TD>子程序13</TD> <TD>……</TD> <TD>子程序1n</TD></TR> <TR bgColor=#efefef> <TD>子程序21</TD> <TD>子程序22</TD> <TD>子程序23</TD> <TD> </TD> <TD>子程序2n</TD></TR> <TR bgColor=#efefef> <TD>子程序31</TD> <TD>子程序32</TD> <TD>子程序33</TD> <TD> </TD> <TD>子程序3n</TD></TR> <TR bgColor=#efefef> <TD>……</TD> <TD> </TD> <TD> </TD> <TD> </TD> <TD> </TD></TR> <TR bgColor=#efefef> <TD>子程序m1</TD> <TD>子程序m2</TD> <TD>子程序m3</TD> <TD> </TD> <TD>子程序mn</TD></TR></TBODY></TABLE> 從上面的兩個(gè)表中不難看出除表1中的第一行為標(biāo)題行(菜單欄),表1與表2有相同結(jié)構(gòu),兩個(gè)表之間的元素存在著一一對應(yīng)的關(guān)系,即每個(gè)菜單名稱下對應(yīng)著所調(diào)用的程序名(備注: 由于每個(gè)菜單標(biāo)題欄下的子菜單的內(nèi)容是不一樣的,因而每個(gè)子菜單下的菜單數(shù)目也各不相同,表中一些元素可以是空值,它表示在此沒有菜單選擇項(xiàng))。 文中介紹方法的技術(shù)難點(diǎn)在于選擇光標(biāo)位置與實(shí)際光標(biāo)位置的關(guān)系。所謂選擇光標(biāo)位置是指在上下左右鍵的控制下,光標(biāo)在菜單界面的位置,也就是光標(biāo)在表中的行和列的位置。而實(shí)際光標(biāo)位置是指光標(biāo)在計(jì)算機(jī)屏幕上的實(shí)際位置。如何通過選擇光標(biāo)位置計(jì)算出實(shí)際光標(biāo)位置是本程序的一個(gè)難點(diǎn)。本程序的處理辦法是將選擇光標(biāo)的行列位置分別作為計(jì)算函數(shù)的參數(shù),通過函數(shù)計(jì)算出實(shí)際光標(biāo)的位置。 實(shí)現(xiàn)步驟 先將菜單的內(nèi)容按照一定的格式顯示在計(jì)算機(jī)屏幕上。顯示格式要依據(jù)表的結(jié)構(gòu)與內(nèi)容而定,而不能固定不變。如果事先固定下來,會(huì)使顯示格式與內(nèi)容之間產(chǎn)生矛盾,難以達(dá)到相互之間的統(tǒng)一,程序就不具備通用性。 選擇光標(biāo)在菜單欄左右移動(dòng)確定選擇項(xiàng)目的同時(shí)將菜單欄下所包含的子菜單內(nèi)容顯示出來。菜單欄最右端的菜單選擇項(xiàng)一般情況下表示“退出”,當(dāng)選擇光標(biāo)處于這個(gè)位置時(shí),回車后退出整個(gè)菜單的選擇。 在菜單欄中回車或按↓鍵進(jìn)入菜單欄下一級(jí)子菜單,按照所顯示的子菜單內(nèi)容,選擇光標(biāo)上下移動(dòng)確定所選定的子菜單內(nèi)容,回車執(zhí)行所調(diào)用的子程序,←、→兩個(gè)鍵退出子菜單的選擇。 需要說明的是由于在Unix系統(tǒng)中,光標(biāo)在上下左右移動(dòng)時(shí), Unix系統(tǒng)的read命令無法捕獲←、↑、→、↓鍵的控制字符,無法對光標(biāo)進(jìn)行有效的控制,為了獲取移動(dòng)光標(biāo)的控制字符,這里需要用C語言編寫一個(gè)函數(shù),其主要功能是在光標(biāo)進(jìn)行上下左右移動(dòng)時(shí),能夠準(zhǔn)確地返回←、↑、→、↓控制鍵的ASCII值,函數(shù)名為getchar。 程序分析 由于光標(biāo)移動(dòng)過程中涉及光標(biāo)的行列位置等重復(fù)運(yùn)算,運(yùn)用函數(shù)可減少程序自身的長度,使程序變得短小、精悍。這里涉及以下一些函數(shù): 1. 畫框函數(shù) 前面提到顯示格式依據(jù)表的結(jié)構(gòu)而定,對菜單的邊框長度的設(shè)置不能固定不變,它要依據(jù)菜單標(biāo)題欄的長度以及標(biāo)題欄的標(biāo)題個(gè)數(shù)而定。這個(gè)函數(shù)的功能就是依據(jù)菜單界面寬度畫邊框,參數(shù)$1表示邊框的橫線與豎線。 menu_x() { _R=$1 col_x=1 while [ col_x -le ${S_LENGTH} ] do if [ $_R ]; then echo $_R“c” else echo “c” fi col_x=‘expr $col_x + 2' done } 2. 計(jì)算實(shí)際光標(biāo)在屏幕上的行列位置函數(shù) 選擇光標(biāo)在標(biāo)題欄左右移動(dòng)的過程中,需要計(jì)算光標(biāo)在屏幕上的實(shí)際位置,通過這個(gè)函數(shù)可以準(zhǔn)確地計(jì)算出這個(gè)實(shí)際位置。其運(yùn)算過程是將選擇光標(biāo)在表中的行列位置作為函數(shù)的參數(shù),依據(jù)這兩個(gè)參數(shù)計(jì)算出光標(biāo)在屏幕上的準(zhǔn)確位置,并將選擇光標(biāo)按照計(jì)算出的位置在屏幕上準(zhǔn)確顯示。其中變量SCREEN- CUR表示表1的元素內(nèi)容,也就是菜單界面的菜單名稱,變量SCREEN-R和SCREEN-C分別表示實(shí)際光標(biāo)在屏幕上位置。執(zhí)行的結(jié)果是將選擇光標(biāo)的內(nèi)容按實(shí)際光標(biāo)的位置顯示在屏幕上。 menu_c() { _C=$1 # 選擇光標(biāo)在菜單界面的列位置 _R=$2 # 選擇光標(biāo)在菜單界面的行位置 SCREEN_CUR=‘a(chǎn)wk -F“|” “NR==$_R { print }”menu|cut -d“|” -f$_C' if [ $_C -gt 1 ]; then F_C=‘expr $_C - 1' SCREEN_LENG=‘head -1 menu| cut -d“|” -f0-$F_C|sed -e ‘s/|//g' | awk ‘{ print length($0)}'' else SCREEN_LENG=0 fi SCREEN_R=‘expr $_R + 2' SCREEN_C=‘expr $C_COL + $SCREEN_LENG + 2' SCREEN_CUR_X=“33[${SCREEN_R};${SCREEN_C}H${SCREEN_CUR}” } 3. 計(jì)算選擇光標(biāo)在移動(dòng)過程中位置的函數(shù) 選擇光標(biāo)在上下左右的移動(dòng)過程中,其在菜單界面的位置也隨之發(fā)生變化,需要通過運(yùn)算,以確定選擇光標(biāo)在菜單界面的準(zhǔn)確位置。其中參數(shù)$1表示上下左右鍵所返回的ASCII值,當(dāng)參數(shù)$1等于2或3時(shí),表示選擇光標(biāo)在上移或左移; 等于1或4時(shí)表示選擇光標(biāo)在向下移動(dòng)或向右移動(dòng)。參數(shù)$2表示選擇光標(biāo)移動(dòng)過程中在表1中的位置,參數(shù)$3表示選擇光標(biāo)移動(dòng)過程中所限定的區(qū)間范圍。 menu_x_y() { _Z=$1 _S=$2 _L=$3 case $_Z in 2|3) if [ $_S -gt 1 ] then _S=‘expr $_S - 1' else _S=$_L fi 1|4) if [ $_S -lt $_L ] then _S=‘expr $_S + 1' else _S=1 fiesac return $_S } 4. 計(jì)算菜單界面每個(gè)菜單欄下的菜單數(shù)目函數(shù) 通常情況下每個(gè)菜單標(biāo)題下所包含的內(nèi)容是不一樣的,因而每個(gè)菜單欄下菜單的數(shù)目也是不相同的,需要對每個(gè)菜單欄下的菜單數(shù)目進(jìn)行計(jì)算,參數(shù)$1表示選擇光標(biāo)在菜單欄下的列位置。 menu_row_number() { _H=$1 S_NUMBER=‘cut -d“|” -f$_H menu|sed -e ‘s/ //g'-e ‘/^$/d'| awk ‘END { print NR}'' } 5. 執(zhí)行子程序函數(shù) 子程序名存在prg文件中,表2中的元素就是子程序名。調(diào)用子程序的過程實(shí)際就是根據(jù)選擇光標(biāo)在菜單界面的行列位置將相應(yīng)位置的元素讀出來,然后依據(jù)表2所提供的程序名判斷是否真實(shí)存在,如果存在則執(zhí)行。 menu_prg() { _C=$1 # 選擇光標(biāo)在菜單界面的列位置 _R=$2 # 選擇光標(biāo)在菜單界面的行位置 prg_name=‘a(chǎn)wk -F“|” “NR==$_R { print }” prg|cut -d“|” -f$_C' if [ -s $prg_name ] then eval $prg_name # 執(zhí)行所調(diào)用的子程序 else echo “07” fi } 下面是主程序: # 設(shè)置菜單界面前景與背景顏色 COLOR1=“33[32;44;1m” # 菜單界面的前景色 COLOR2=“33[33;45;1m” # 菜單界面的背景色 COLOR3=“33[37;40;1m” # 選擇光標(biāo)的顏色 # 對程序中所用的一些變量進(jìn)行初始化設(shè)置 CUR_R=1 #選擇光標(biāo)在菜單界面的行位置 CUR_C=1 #選擇光標(biāo)在菜單界面的列位置 S_LENGTH=‘head -1 menu|sed -e ‘s/|//g' | awk ‘{ print length($0)}'' # 確定菜單界面的寬度 S_MENU=‘head -1 menu| awk -F“|” ‘{ print NF}'' # 確定菜單標(biāo)題欄的字段數(shù) C_COL=‘expr ( 80 - $S_LENGTH - 4 ) / 2 ' # 確定菜單界面的起始位置 echo ${COLOR1}; clear # 按格式顯示菜單界面 row=2 # 顯示行 [2-23] while [ row -le 23 ] do case $row in 2) echo “33[${row};${C_COL}H┏c”; menu_x “━”; echo “┓” 3) echo “33[${row};${C_COL}H┃c”; head -1 menu |sed -e ‘s/|//g' |awk ‘{ print $0 “┃” }'23) echo “33[${row};${C_COL}H┗c”; menu_x “━”; echo “┛c” *) echo “33[${row};${C_COL}H┃c”; menu_x “ ”; echo “┃” esac row=‘expr $row + 1' done while true do menu_c $CUR_C $CUR_R # 計(jì)算選擇光標(biāo)的位置 echo “${COLOR2}${SCREEN_CUR_X}c” stty -echo getchar # 等待選擇 ANS_X=$? # 返回ASCII值 stty echo echo “${COLOR1}${SCREEN_CUR_X}c” case $ANS_X in 3|4) menu_x_y $ANS_X $CUR_C $S_MENU #選擇光標(biāo)在菜單標(biāo)題欄中左右移動(dòng) CUR_C=$?1|10) if [ $CUR_C = $S_MENU ] #按回車鍵或↓鍵進(jìn)入子菜單 then setcolor -n ; clear; break fi menu_row_number $CUR_C # 在菜單標(biāo)題欄下將所包含子菜單內(nèi)容顯示在屏幕上 row=2 while [ row -le ${S_NUMBER} ] do menu_c $CUR_C $row echo “${COLOR3}${SCREEN_CUR_X}c” row=‘expr $row + 1 ' done while true do menu_c $CUR_C $CUR_R echo “${COLOR2}${SCREEN_CUR_X}c” stty -echo getchar ANS_Y=$? stty echo echo “${COLOR3}${SCREEN_CUR_X}c” case $ANS_Y in 1|2) menu_x_y $ANS_Y $CUR_R $S_NUMBER #上下移動(dòng)選擇光標(biāo) CUR_R=$?3|4) menu_x_y $ANS_Y $CUR_C $S_MENU #左右移動(dòng)選擇光標(biāo)退出子菜單選擇 CUR_C=$? CUR_R=1 break10) menu_prg $CUR_C $CUR_R#回車后執(zhí)行子程序 *) echo “07”esac done *) echo “07c”esac done 小結(jié) 本文所論述的是如何在Unix系統(tǒng)下利用shell制作通用的下拉菜單。這種通用性集中體現(xiàn)在實(shí)現(xiàn)了菜單下的菜單名稱以及所調(diào)用的子程序名稱與菜單主程序的分離,菜單界面下子菜單名稱以及所調(diào)用的子程序名稱分別存放在兩個(gè)文本文件中,主程序通過對這兩個(gè)文件的讀取實(shí)現(xiàn)了菜單程序的正確顯示與選擇功能。只要對這兩個(gè)文本文件進(jìn)行編輯,不需要對主程序進(jìn)行任何改動(dòng),即可完成Unix系統(tǒng)下拉菜單的制作,使得菜單制作非常快捷、靈活。同時(shí)可以很方便地進(jìn)行移植,因而有較強(qiáng)的通用性。而且采用這種方式制作出來的下拉菜單界面比較直觀、明了,操作起來更加簡單、方便。 備注:在編輯menu和prg文件時(shí),子菜單名稱和子程序名稱是一一對應(yīng)的關(guān)系,所以子菜單與子程序在文件中位置要擺放正確,不能亂放。由于在本程序中awk語句的所有分隔符都是“|”,而不是空格,因而文本文件中的分隔符也是“|”,而不能用空格,這一點(diǎn)在編輯這兩個(gè)文件時(shí)要特別注意。

標(biāo)簽: Unix系統(tǒng)
主站蜘蛛池模板: 日本高清色本在线www | 欧美一级高清在线观看 | 国产精品视频第一区二区三区 | 精品厕拍 | 日韩亚洲成a人片在线观看 日韩亚洲精品不卡在线 | 9久9久女女热精品视频免费观看 | 欧美精品片在线观看网站 | 男人操女人逼逼视频 | 色香欲综合成人免费视频 | 日本乱人伦片中文三区 | 欧美国产在线视频 | 怡红院宜春院 | 一级中国乱子伦视频 | 5388国产亚洲欧美在线观看 | 国内久久 | 国产一二区 | 夜夜躁狠狠躁日日躁2021 | 国产视频a区 | 亚洲精品成人 | 丁香久久| 欧美日韩a∨毛片一区 | 国产a级特黄的片子视频免费 | 国产不卡在线播放 | 国产成人精品免费午夜 | 成人午夜影院 | 亚洲无吗 | 美国毛片免费看 | 亚洲美女在线观看 | 国产精品一国产精品免费 | 亚洲免费视频一区 | 美女毛片视频 | 欧美黄色一级在线 | 成视频年人黄网站免费 | 免费看欧美一级a毛片 | 久久免费手机视频 | 亚洲性生活视频 | 麻豆国产96在线 | 中国 | 波多野结衣在线不卡 | 国产精品黄网站免费进入 | 97久久精品国产精品青草 | 国产精品久久久久国产精品 |