版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、shell腳本例子集錦(習(xí)題總結(jié))練習(xí)一:寫一個(gè)腳本 1.設(shè)定變量FILE的值為/etc/passwd 2.依次向/etc/passwd中的每個(gè)用戶問好,并且說出對方的ID是什么 形如:(提示:LINE=wc -l /etc/passwd | cut -d" " -f1)
2、0; Hello,root,your UID is 0. 3.統(tǒng)計(jì)一個(gè)有多少個(gè)用戶 答案一:#!/bin/bash file="/etc/passwd" LINES=wc -l $file | cut -d&
3、quot; " -f1 for I in seq 1 $LINES;do userid=head -$I $file | tail -1 |cut -d: -f3 username=head -$I $file | tail -1
4、 |cut -d: -f1 echo "hello $username,your UID is $userid" done echo "there are $LINES users"
5、60; 答案二:#!/bin/bash file=/etc/passwd let num=0 for I in cat $file;do
6、0; username=echo "$I" | cut -d: -f1 userid=echo "$I" | cut -d: -f3 echo "Hello,$username,your UID is $userid"
7、; num=$num+1 done echo "there are $num users"練習(xí)二:寫一個(gè)腳本 1.切換工作目錄至/var 2.依次向
8、/var目錄中的每個(gè)文件或子目錄問好,形如: (提示:for FILE in /var/*;或for FILE in ls /var;) Hello,log 3.統(tǒng)計(jì)/var目錄下共有多個(gè)文件,并顯示出來 答案:#!/bin/bash cd /var &
9、#160; let num=0 for I in ls /var/*;do echo "hello $I" num=$num+1
10、0; done echo "the number of files is $num"練習(xí)三:寫一個(gè)腳本 1.設(shè)定變量file的值為/etc/passwd 2.使用循環(huán)讀取文件/etc/passwd的第2,4,6,10,13,15行,并顯示其內(nèi)容 3.把這些行保存至/tmp/mypasswd文件中
11、0; 答案:#!/bin/bash file="/etc/passwd" for I in 2 4 6 10 13 15;do exec 3>/tmp/mypasswd line=head -$I $file | tail -1
12、; echo "$line" echo "$line" >&3 exec 3>&- done練習(xí)四:寫一個(gè)腳本 傳遞兩個(gè)整數(shù)給腳本,讓腳本分別計(jì)算并顯示這兩個(gè)整數(shù)的和,差,積,商
13、0; 答案如下:vim test.sh #!/bin/bash echo "first number
14、 $1" (表示輸出第一個(gè)數(shù)) echo "second number $2" (表示輸出第二個(gè)數(shù))
15、160; echo " $($1+$2)" (輸出兩數(shù)之和) echo "$1-$2" (輸出兩數(shù)之差)
16、160; echo "$1*$2" (輸出兩數(shù)之積) echo "$
17、1/$2" (輸出兩數(shù)之商) :wq
18、(表示保存并退出vi編輯器) chmod +x test.sh (給test.sh執(zhí)行的權(quán)限) &
19、#160; ./test.sh 2 3 (傳遞兩個(gè)參數(shù)并執(zhí)行腳本 作業(yè)一:寫一個(gè)腳本: 1.創(chuàng)建目錄/tmp/scripts 2.切換工作目錄至此目錄中 3.復(fù)制/etc/pam.d目錄至當(dāng)前目錄,并重命名
20、為test 4.將當(dāng)前目錄的test及其里面的文件和子目錄的屬主改為redhat 5.將test及其子目錄中的文件的其它用戶的權(quán)限改為沒有任何權(quán)限 答案: #!/bin/bash mkdir -v /tmp/scripts
21、 cd /tmp/scripts cp -r /etc/pam.d ./test chown -R redhat ./test chmod -R o=- ./test作業(yè)二:寫一個(gè)腳本 1.顯示當(dāng)前系統(tǒng)日期和時(shí)間,而后創(chuàng)建目錄/tmp/lstest
22、160; 2.切換工作目錄至/tmp/lstest 3.創(chuàng)建目錄a1d,b56e,6test 4.創(chuàng)建空文件xy,x2y,732 5.列出當(dāng)前目錄下以a,x或者6開頭的文件或目錄 6.列出當(dāng)前目錄下以字母開頭,后跟一個(gè)任意數(shù)字,而后跟任意長度字符的文件或目錄
23、0; 答案: #!/bin/bash date mkdir -pv /tmp/lstest cd /tmp/lstest mkdir a1d b56e 6test &
24、#160; touch xy x2y 732 ls ax6* ls :alpha:digit:* 作業(yè)三:寫一個(gè)腳本 添加10個(gè)用戶user1到user10,但要求只有用戶不存在的情況下才能添加
25、 答案: #!/bin/bash for I in seq 1 10;do cut -d: -f1 /etc/passwd |grep "user$I" 2>>/tmp/etc.err | useradd user$I done作業(yè)四:寫一個(gè)腳本
26、; 通過ping命令測試192.168.0.151到192.168.0.254之間的所有主機(jī)是否在線 如果在線,就顯示“ip is up” 如果不在線,就顯示“ip is down” 答案: #!/bin/bash for I in seq 151 254;do
27、160; ping -c1 -w1 192.168.0.$I &>/dev/null && echo "192.168.0.$I is up" | echo "192.168.0.$I is down" done例題:shell1.sh 顯示日期和時(shí)間。#!/bin/bashecho “current time
28、is date” /date要加反引號shell2.sh 顯示文件名,并顯示位置參數(shù)(執(zhí)行時(shí)帶一個(gè)參數(shù))。($0是一個(gè)特殊的變量,它的內(nèi)容是當(dāng)前這個(gè)shell程序的文件名;$1是一個(gè)位置參數(shù),位置參數(shù)之間用空格分隔,shell取第一個(gè)位置參數(shù)替換程序文件中的$1,第二個(gè)替換$2,依次類推。)#!/bin/bashecho “the program name is $0” /$0是一個(gè)特殊的變數(shù)echo “the first para is $1” /$1是一個(gè)位置參數(shù)echo “the program exit” /執(zhí)行時(shí)帶一個(gè)參數(shù) 如./shell2.sh abcdshell3.sh 判斷并
29、顯示位置參數(shù)#!/bin/bashif -d “$1”;thenecho “$1 is directory ,existed”elseecho “$1 does not exist ,now create it”mkdir $1echo “$1 is created”fi /執(zhí)行時(shí)帶一個(gè)參數(shù)shell4.sh 問候用戶 #!/bin/bashuser=whoami case $user inteacher)echo “hello teacher”;root)echo “hello root”;*)echo “hello $user,welcome”esac1、 求1+2+3+.+100的和是?
30、#!/bin/bashSUM=0I=0while $I -le 100 do SUM=$(SUM+I) I=$(I+1)doneecho "由1+2+3+.+100的和是:$SUM"2、(基訓(xùn)十一) 在根目錄下有四個(gè)文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell編程,實(shí)現(xiàn)自動創(chuàng)建m1,m2,m3,m4四個(gè)目錄,并將m1.txt,m2.txt,m3.txt,m4.txt四個(gè)文件分別拷貝到各自相應(yīng)的目錄下。#!/bin/bashcd /touch m1.txt m2.txt m3.txt m4.txtI=1 while $I -le 4 do mkdi
31、r m$I cp m$I.txt m$I I=$(I+1)done3、(基訓(xùn)十二) 編寫一個(gè)名為myfirstshell.sh的腳本,它包括以下內(nèi)容。a) 包含一段注釋,列出您的姓名、腳本的名稱和編寫這個(gè)腳本的目的。b) 問候用戶。c) 顯示日期和時(shí)間。d) 顯示這個(gè)月的日歷。e) 顯示您的機(jī)器名。f) 顯示當(dāng)前這個(gè)操作系統(tǒng)的名稱和版本。g) 顯示父目錄中的所有文件的列表。h) 顯示root正在運(yùn)行的所有進(jìn)程。i) 顯示變量TERM、PATH和HOME的值。j) 顯示磁盤使用情況。k) 用id命令打印出您的組ID。m) 跟用戶說“Good bye”#!/bin/bash# 09嵌入 5號 賈德
32、進(jìn) myfirstshell.sh shell的簡單編程user=whoamicase $user inroot)echo "hello root"teacher)echo "hello teacher"*)echo "hello $user,welcome"esacecho "日期和時(shí)間: date"echo "本月的日歷: cal"echo "本機(jī)的機(jī)器名:uname -n"echo "當(dāng)前這個(gè)操作系統(tǒng)的名稱和版本:uname -s;uname -r"
33、echo "父目錄中的所有文件的列表:ls ./"echo "root正在運(yùn)行的所有進(jìn)程: ps -u root"echo "變數(shù)TERM的值:$TERM"echo "變數(shù)PATH的值:$PATH"echo "變數(shù)HOME的值:$HOME"echo "磁盤的使用情況:df"echo "用id命令打印出你的組ID:id -g"echo "Good bye!"4、(基訓(xùn)十三) 設(shè)計(jì)一個(gè)Shell程序,在/userdata目錄下建立50個(gè)目錄
34、,即user1user50,并設(shè)置每個(gè)目錄的權(quán)限為 rwxr-xr#!/bin/bashcd /userdataI=1while $I -le 50 do mkdir -p userdata/user$I chmod o-x user$I I=$(I+1)done5、(基訓(xùn)十四) 編寫shell程序,實(shí)現(xiàn)自動刪除50個(gè)用戶賬號的功能。賬號名為stud1至stud50。#!/bin/bashcd /userdataI=1while $I -le 50 do mkdir -p userdata/user$I chmod o-x user$II=$(I+1)done6、(基訓(xùn)十四) 設(shè)計(jì)一個(gè)shel
35、l程序,備份并壓縮/etc目錄的所有內(nèi)容,存放在/root/bak目錄里,且文件名為如下形式y(tǒng)ymmdd_etc,yy為年,mm為月,dd為日。#!/bin/bashDIRNAME=ls |root|grep bak if -z $DIRNAME ; then mkdir /root/bak cd /root/bakfiYY=date + %yMM=date + %mDD=date + %dtar czvf $YY$MM$DD_etc.gz /etcecho "etc bak finshied"7、(基訓(xùn)十四) 某系統(tǒng)管理員需每天做一定的重復(fù)工作,請按照下列要求,編制一個(gè)解
36、決方案:(1)在下午4 :50刪除/abc目錄下的全部子目錄和全部文件;(2)下午5:50將/data目錄下的所有目錄和文件歸檔并壓縮為文件:backup.tar.gz;(3)在下午5:55將IDE接口的第二個(gè)邏輯分區(qū)卸載。/ 采用: vi pram.cron#(1) 在下午4:50刪除/abc目錄下的全部子目錄和全部文件;50 16 * rm -rf /abc/*#(2) 下午5:50將/data目錄下的所有目錄和文件歸檔并壓縮為文件:backup.tar.gz;50 17 * tar czvf back.tar.gz /data#(3) 在下午5:55將IDE接口的第二個(gè)邏輯分區(qū)卸載.55
37、 17 * umount /dev/hda6/ 執(zhí)行:crontab pram.cron=設(shè)計(jì)一個(gè)Shell程序,在/userdata目錄下建立50個(gè)目錄,即user1user50,并設(shè)置每個(gè)目錄的權(quán)限,其中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫、執(zhí)行;文件所有者所在組的權(quán)限為:讀、執(zhí)行。程序?qū)崿F(xiàn)及注釋如下:#! /bin/bash#adddir.shi=1#while循環(huán)while $i -le 50 do#利用 test命令 -d /userdata :判斷/userdata是否存在,如果存在直接創(chuàng)建子目錄,不#存在先創(chuàng)建/userdata再創(chuàng)建子目錄。if -d /userda
38、ta then#mkdir -p的意思是:無論父目錄/userdata存在與否,都會創(chuàng)建/userdata/user$i mkdir -p /userdata/user$i else mkdir /userdata mkdir -p /userdata/user$ifi#根據(jù)題目的意思:/userdata/user$i應(yīng)該是具有754權(quán)限,所以利用chmod賦權(quán)限。chmod 754 /userdata/user$ii=$($i+1)done函數(shù)in_path:判斷傳入文件是否可執(zhí)行,若可執(zhí)行(且存在)返回0, 否則返回1;分析:為測試傳入文件是否在PATH所有的目錄中,需取得PATH中的每個(gè)
39、路徑,可用循環(huán),但需要設(shè)定環(huán)境中的分隔符(借助環(huán)境變量IFS)為 PATH中的分隔符冒號”:” 注:$IFS 輸入分隔符. 當(dāng)shell讀取輸入數(shù)據(jù)的時(shí)候,會把一組字符看做是單詞之間的分隔字符,它們通常是空格,制表符,和換行符.函數(shù)調(diào)用方式為 : in_path filenamein_path()cmd=$1 # $1為函數(shù)的參數(shù)1,以此類推retval=1 #定義返回值變量oldIFS=$IFSIFS=:#設(shè)置新的IFS,并保存原來的以恢復(fù)使用for directory in $PATH #for循環(huán)結(jié)構(gòu)二: for indoif -x directory/$cmd ; then #if條件
40、語句之 同行表示 以分號隔開retval=0 # -x 判斷文件有是否有可執(zhí)行權(quán)限donedoneIFS=$oldIFS #恢復(fù)原來IFS, return retval注:1.函數(shù)的結(jié)構(gòu), 沒有形參2.變量的引用需要符號$,而變量的定義或賦值則不需要。3.賦值要無間隙, 條件要間隙改進(jìn): 1.將路徑、分隔符均作為函數(shù)的參數(shù)傳入,應(yīng)用得到擴(kuò)展。補(bǔ)充,in_path函數(shù)不能對絕對路徑的文件處理,需寫個(gè)函數(shù)對這一情況單獨(dú)處理checkForCmdInPath()var=$1#首先判斷傳入的非空串是否為絕對路徑,即檢測第一個(gè)字符是不是”/”,如果是,直接測 x if $var != “” ; then
41、 # 條件等價(jià)于 -n $varif “$var%$var#?” = / ; then #等價(jià)于 $(echo $var | cut -c1) if ! -x $var ; thenreturn 1 #not found or not executable fielif ! inpath $var ; then return 2 #not found in PATHfifi注:此函數(shù)讓人一頭霧水,詳解如下:1) 表達(dá)式$var%$var#?作匹配用,分解為 $var%expr $var#expr ,expr為正則表達(dá)式(? 匹配單一字符) 后者(帶#的)返回 expr與var匹配成功位置之后的
42、所有內(nèi)容,此處為var中第一字符之后的所有。 前者(帶%的)返回 expr與var匹配成功位置之前的所有內(nèi)容,此處應(yīng)為 var的第一個(gè)字符。 等價(jià)于 $(echo $var | cut c1) 即取第一字符。等價(jià)于 $var:beginpos:size 中beginpos=0,size=1時(shí)的結(jié)果。 var的符號放在外面了,假設(shè)$var為$1,則表達(dá)式表示為 $1%$1#?2) 關(guān)于if的條件判斷與C語言中的理解不一致,反映在上述的 elif語句中的條件。理解如下:shell中的if條件可以是 表達(dá)式(需加方括號),另外還可以是命令或函數(shù)(不需方括號), 當(dāng)命令執(zhí)行成功時(shí)會后繼執(zhí)行具體操作,經(jīng)
43、測試,C語言中所說的true在shell中 用0表示,即if 0,才執(zhí)行then,因?yàn)閘inux下的程序?qū)崿F(xiàn)都是當(dāng)返回0時(shí)表執(zhí)行成功。3) 若函數(shù)中沒有返回值,則它默認(rèn)返回0,表執(zhí)行成功。 函數(shù)的編寫若遵從以上的原則, 則對條件的理解 依舊像C語言中的TRUE,FALSE一樣理解= 完善程序代碼 =#!/bin/bashin_path(). # 函數(shù)實(shí)現(xiàn)區(qū)域 處理不路徑 返回0表找到、可執(zhí)行, 否則返回1#checkForCmdInPath(). # 函數(shù)實(shí)現(xiàn)區(qū)域 處理帶路徑和不帶路徑的 返回1表沒找到或不可執(zhí)行,返回2表沒找到。默認(rèn)0表找到 # # 代碼執(zhí)行起始位置 # if $# -nq
44、1 ; thenecho “Usage: $0 command” #$0 表此執(zhí)行文件 (具體內(nèi)容 以 執(zhí)行此文件時(shí)的輸入串為準(zhǔn))exit 0 fi# 調(diào)用函數(shù),并經(jīng)第一個(gè)參數(shù)傳給函數(shù)checkForCmdInpath $1# 對函數(shù)返回的結(jié)果進(jìn)行判斷 $? 為函數(shù)的返回值,case $? in # case 控制結(jié)構(gòu)的格式,注意紅色部分。0)echo “found in PATH”;1)echo “not found or not executable”;2)echo “not found”; # *) ; 類似于C語言中的 default=2.寫一個(gè)腳本,檢測用戶輸入串的合法性, 要求串由
45、大小寫字母、數(shù)字組成,無標(biāo)點(diǎn)、特殊符號、空格。思路:將輸入的串中 非字母數(shù)字的內(nèi)容刪除或替換為空后若和原來輸入的相同則合法,否則不合法。isvalidAlphaNum()compressed=”$(echo $1 | sed 's/:alnum:/g')” #替換不合要求字符為空if “$compressed” != “$1” ; thenreturn 1# not valideelsereturn 0 # validefi注: 1.關(guān)于引用變量時(shí)是否需要雙引號的說明 如果只是輸出,可以不用雙引號 如果變量值代的內(nèi)容中無空格,表達(dá),特殊符號,在引用時(shí)可以不需要雙引號,反之,最好
46、帶雙引號,否則在變量處理時(shí)很有可能會出現(xiàn)“參數(shù)過多”等莫名其妙的錯誤信息。 2.關(guān)于匹配處理,sed是單行編輯程序。 sed s/str1/str2/g file 將文件file中每行內(nèi)str1替換為str2 :alnum:表示所有字母和數(shù)字中的任一個(gè)字符。若只是:alnum:則表示 方括號中的任一個(gè)字符。 :alnum: 表除了所有字母數(shù)字外的任一字符。如果是直接向腳本傳字符串,則帶空格的字串會被腳本自行分解為多個(gè)參數(shù),所以可采用從標(biāo)準(zhǔn)輸入讀取的方式獲得字串。= 完善程序代碼 =#!/bin/bashisvalidAlphaNum() . #函數(shù)體,判斷字串的合法性echo -n “Ente
47、r input:”# -n 強(qiáng)制不換行read input#讀取內(nèi)容存到input中, 無 $ 符號if ! isvalidAlphaNum “&input” ; then #加引號,否則可能會出錯。echo “invalide”exit 1elseecho “valide”fiexit 0=3輸入一個(gè) “month day year”格式的日期串,程序?qū)⑻幚怼?month”為 其英文單詞的前三個(gè)字母,第一個(gè)字母大寫,其余的小寫。思路:首先判斷month是數(shù)字、還是單詞,若是數(shù)字,則可查“數(shù)字month”映射表(自定義case結(jié)構(gòu));若是單詞,則取前三個(gè)字母,并格式化。函數(shù)monthn
48、oToName() 將month數(shù)字轉(zhuǎn)換為month名monthnoToName() case $1 in 1 ) month="Jan" ; 2 ) month="Feb" ; 3 ) month="Mar" ; 4 ) month="Apr" ; 5 ) month="May" ; 6 ) month="Jun" ; 7 ) month="Jul" ; 8 ) month="Aug" ; 9 ) month="Sep&qu
49、ot; ; 10) month="Oct" ; 11) month="Nov" ; 12) month="Dec" ; * ) echo "$0: Unknown numeric month value $1" >&2; exit 1 # default, esac# return 0假設(shè)通過傳三個(gè)參數(shù)到腳本month day year- 實(shí)現(xiàn)代碼 -#!/bin/bashif $# -ne 3 ; then #若參數(shù)個(gè)數(shù)不為3,則有誤echo “Usage: $0 month day year”ex
50、it 1fi#判斷參數(shù)1是數(shù)字還是單詞,方法 替換串中所有數(shù)字,若結(jié)果為空,則為數(shù)字,否則為單詞。if -n $(echo $1 | sed s/:digit:/g) # -n 檢測串是為空thenmonthnoToName $1# 數(shù)字else# 取第一個(gè)字母并將其變?yōu)榇髮?,再將結(jié)果與取出的第二三字母組合month=”$(echo $1 | cut c1 | tr ':lower:' ':upper:')“month=”$month$(echo $1 | cut -c2-3 | tr ':upper:' ':lower:')”f
51、iecho $month $2 $3 # 輸出結(jié)果exit 0-注:1.外圍可以使用函數(shù)中定義的變量,如函數(shù)monthnoToName中定義的month變量,最后echo會用到它。2. 多管道(|)的使用3. month變量的合并, $var$var4. tr SET1 SET2 轉(zhuǎn)換/刪除/替換 命令, 將默認(rèn) 將SET1 替換為 SET2 tr 默認(rèn)從標(biāo)準(zhǔn)輸入讀取,處理后 寫入 標(biāo)準(zhǔn)輸出。5. cut c2-3 file取文件每行第2,3字母。擴(kuò)展: 處理MM/DD/YYYY or MM-DD-YYYY 的形式。在判斷三個(gè)參數(shù)前執(zhí)行命令set - $(echo $1 | sed '
52、s/-/ /g') 。set 的 - 命令可以將其后的參數(shù)賦予 位置參數(shù)($1,$2,.) 。 鏈接 set 指令 用法4. 格式化輸出 大數(shù)字,使輸出結(jié)果更容易讓人知道該輸出數(shù)字的數(shù)量級。默認(rèn)用逗號分隔整數(shù)部分,用點(diǎn)號分隔整數(shù)與小數(shù)部分,當(dāng)然用戶也可以使用 d 指定整數(shù)的分隔符,用-t指定整數(shù)與小數(shù)部分的分隔符。算法: 1232342142.423023 => 默認(rèn):1,232,342,142.423023(1)首先分開整數(shù)部分integer 和小數(shù)部分decimal, sed d. -f1 和 sed d. -f2 分別取兩部分。(2)整數(shù)部分的處理: 當(dāng)作數(shù)字來處理 %運(yùn)算
53、 /運(yùn)算1)每次取整數(shù)低三位,長度小于3就補(bǔ)前綴0(避免出現(xiàn)漏0情況,例如低三位為003時(shí),取后便為值3)2)將此次得到的三位與上一次得到的三位用分隔符(如果沒有指定就默認(rèn))組合起來。3)整數(shù)去掉低三位,繼續(xù)操作1)。當(dāng)此整數(shù)小于等于999就不再繼續(xù)。 當(dāng)字串來處理:1)每次取低三位, cut c $($#str - 2)-$#str $#str 為str的長度,必須為大括號。$( ) 的內(nèi)部為str長度-2,代表倒數(shù)低三個(gè)字符。因?yàn)閮?nèi)部是減法,所有此為雙小括號。2)原串每次都要裁掉尾部三個(gè)字符,每次取到的字串的長度為循環(huán)判斷條件。函數(shù) nicenumber()作如上處理nicenumber(
54、)# 傳入 integer.decimal 如2000023.2, 32232332等# 分別取 整數(shù)部分和小數(shù)部分integer=$(echo $1 | cut d. f1)decimal=$(echo $1 ! cut d. f2)# 判斷小數(shù)部分是否存在,因?yàn)檫@涉及連接整數(shù)和小數(shù)的連接符問題# 設(shè)DD 為 整數(shù)和小數(shù)之間分隔符,默認(rèn)為 .if n $decimal ; then#若非空,即有小數(shù)部分。#以下四句可用一句表示:result=”$DD:=”.”$remainder$result”if -z $DD ; then #判斷用戶是否自定義整數(shù)與分隔符,若空DD=.firesult=
55、$DD$decimal # 在小數(shù)部分前加 分隔符。fithousand=$integerwhile thousand gt 999 doremainder=$(thousand%1000)while $#remainder lt 3 ;do#$#remainder 為remainder串的長度remainder=0$remainder# 避免remainder為00x時(shí)的丟0情況。donethousand=$($thousand/1000)#以下四句可用一句表示:result=”$TD:=”,”$remainder$result”# 上面藍(lán)色部分表:若TD非空則返回TD,否則將”,”賦給TD
56、.if z $TD ; then# 判斷用戶是否自定義整數(shù)分隔符, 若 空TD=,firesult=”$TD$remainder$result”# 與分隔符合成串。 注意順序doneif n $thousand ; then# 若 非空result=”$thousand$result”elif $result%$result#? = “$TD” ; thenresult=”$result#?”fiecho $result腳本標(biāo)志參數(shù)處理命令: getopts “” var帶兩個(gè)參數(shù),第一個(gè)參數(shù)為帶解析的 參數(shù)標(biāo)志序列串(如-f,-c等), 以冒號(:)分隔各標(biāo)志,且以冒號:結(jié)束第二個(gè)參數(shù)為:變
57、量,每執(zhí)行一次存放 參數(shù)標(biāo)志序列串中的一個(gè)標(biāo)志字符返回值:未解析結(jié)束返回0,解析結(jié)束返回1涉及的內(nèi)定變量:$OPTARG 每次解析標(biāo)志對應(yīng)的參數(shù)值 便默認(rèn)存放在此變量內(nèi)。$OPTIND當(dāng)各標(biāo)志處理無誤情況下,該數(shù)值指示當(dāng)前用到的最大位置參數(shù)($#)。 此值使用容易出錯(若參數(shù)的判斷不完善時(shí)), 還不如用 $#另外 $1, $2, $3, $4, => 此時(shí) $# 等于 4,當(dāng)執(zhí)行shift 1 時(shí), 各個(gè)位置參數(shù)的值向一次向左右1次,此時(shí) $1的值 為原$2的值當(dāng)執(zhí)行shift 2 時(shí), 各個(gè)位置參數(shù)的值向一次向左右2次,此時(shí) $1的值 為原$3的值。完整代碼 - nicenumber.
58、sh -nicenumber(). # 函數(shù)實(shí)現(xiàn)部分#處理腳本標(biāo)志參數(shù)while getopts “d:t:” optdocase $opt in# $opt 為 具體的標(biāo)志字符d ) DD=”$OPTARG”;# $OPTARG 為標(biāo)志指定的參數(shù)值t ) TD=”$OPTARG”;* ) echo “no arg-flag: $opt” >&2;exit 1esacdone# 當(dāng)腳本接收如此多的參數(shù)時(shí),$1將不代表腳本最終要處理的大數(shù)字,所以做如下操作。shift $($OPTIND - 1) nicenumber $1exit 0-擴(kuò)展:1.不同國家整數(shù)與小數(shù)的分隔符不同,使
59、腳本能夠處理各種整數(shù)與小數(shù)各種分隔符情況。在傳給腳本參數(shù)時(shí)需指定標(biāo)志-d程序中僅需在 分隔 整數(shù)與小數(shù)部分略修改為integer=$(echo $1 | cut “d$DD:=”.” f1 )decimal=$(echo $1 | cut “d$DD” f2 )2.另外,可以在程序執(zhí)行之前分別初始化DD,TD默認(rèn)值。3. 檢測傳給腳本的大數(shù)值中是否含有 非法的整小數(shù)分隔符,即存在與用戶指定或默認(rèn)分隔符不同的符號。 方法:刪除其中所有數(shù)字,看剩下的內(nèi)容,若不空且不等于$DD,則非法separator=”$(echo $1 | sed s/:digit:/g)”if -n $separator && “$separator” != “$DD” ;then # 藍(lán)色部分可用 a 表示exit 1fi5. 檢測 輸入整數(shù)的合法性,可負(fù)數(shù)(-1, -2均合法), 可以指定傳入整數(shù)范圍,不在范圍內(nèi)則報(bào)錯。參數(shù):1或3個(gè), 當(dāng)3個(gè)時(shí),后兩個(gè)為范圍。合法性:正負(fù)數(shù)的判斷,范圍的判斷。validint()integer=$1min=$2max=$3# 判斷傳參的合法性,以下判斷是錯誤的,因?yàn)椴还軈?shù)是否為空,實(shí)際上都傳了三個(gè)參數(shù)。if $
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024的廣東省室內(nèi)環(huán)境質(zhì)量保證合同C款(家具購買)
- 2024建筑合同法全文
- 鋼結(jié)構(gòu)施工承包合同范本
- 2024個(gè)人住房裝修合同書協(xié)議
- 收藏品贈送合同范本
- 面包店轉(zhuǎn)讓協(xié)議書模板
- 建筑工程監(jiān)理服務(wù)合同
- 建筑設(shè)備出租合同范本
- 普通合伙人合同協(xié)議書范文
- 證券交易云平臺運(yùn)營協(xié)議
- 勞動合同制工人登記表
- 21.模具設(shè)計(jì)標(biāo)準(zhǔn)要點(diǎn)
- 簫笛自己做——簫笛制作原理、印度班蘇里和尼泊爾笛簡易制作Word版
- 鋁合金壓鑄件檢驗(yàn)標(biāo)準(zhǔn)20160426
- 三級配電箱電路圖(共2頁)
- 工具式懸挑防護(hù)棚安全專項(xiàng)施工方案
- 《2021國標(biāo)暖通圖集資料》14K117-3 錐形風(fēng)帽
- 機(jī)動車維修企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化考評方法和考評實(shí)施細(xì)則(完整版)
- 江西省職業(yè)培訓(xùn)補(bǔ)貼范圍及標(biāo)準(zhǔn)-江西省職業(yè)技能鑒定指導(dǎo)中心
- 七年級生物上冊(濟(jì)南版)知識點(diǎn)歸納
- 應(yīng)急聯(lián)防聯(lián)動協(xié)議
評論
0/150
提交評論