shell腳本練習(xí)題_第1頁(yè)
shell腳本練習(xí)題_第2頁(yè)
shell腳本練習(xí)題_第3頁(yè)
shell腳本練習(xí)題_第4頁(yè)
shell腳本練習(xí)題_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余22頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、shell 腳本例子集錦(習(xí)題總結(jié))練習(xí)一:寫一個(gè)腳本1. 設(shè)定變量FILE 的值為 /etc/passwd2. 依次向 /etc/passwd 中的每個(gè)用戶問好,并且說(shuō)出對(duì)方的ID 是什么形如:(提示:LINE='wc -l /etc/passwd | cut -d" " -fl')Hello,root , your UID is 0.3. 統(tǒng)計(jì)一個(gè)有多少個(gè)用戶答案一:#!/bin/bashfile="/etc/passwd"LINES='wc -l $file | cut -d" " -f1'for

2、 I in 'seq 1 $LINES'douserid='head -$I $file | tail -1 |cut -d: -f3'username='head -$I $file | tail -1 |cut -d: -f1'echo "hello $username,your UID is $userid"doneecho "there are $LINES users"答案二:#!/bin/bashfile=/etc/passwdlet num=0for I in 'cat $file&#

3、39;dousername='echo "$I" | cut -d: -f1'userid='echo "$I" | cut -d: -f3'echo "Hello,$username,your UID is $userid"num=$num+1doneecho "there are $num users"練習(xí)二:寫一個(gè)腳本1. 切換工作目錄至/var2. 依次向 /var 目錄中的每個(gè)文件或子目錄問好,形如:(提示:for FILE in /var/*; 或 for FILE in

4、 'Is /var')Hello,log3. 統(tǒng)計(jì) /var 目錄下共有多個(gè)文件,并顯示出來(lái)答案: #!/bin/bashcd /varlet num=0for I in 'ls /var/*'doecho "hello $I"num=$num+1doneecho "the number of files is $num"練習(xí)三:寫一個(gè)腳本1. 設(shè)定變量file 的值為 /etc/passwd2. 使用循環(huán)讀取文件/etc/passwd 的第 2,4,6,10,13,15 行,并顯示其內(nèi)3. 把這些行保存至/tmp/myp

5、asswd 文件中答案: #!/bin/bashfile="/etc/passwd"for I in 2 4 6 10 13 15;doexec 3>/tmp/mypasswdline='head -$I $file | tail -1'echo "$line"echo "$line" >&3exec 3>&-done練習(xí)四:寫一個(gè)腳本傳遞兩個(gè)整數(shù)給腳本,讓腳本分別計(jì)算并顯示這兩個(gè)整數(shù)的和,差,積,答案如下:vim test.sh#!/bin/bashecho "first

6、number $1"(表示輸出第一個(gè)數(shù))echo "second number $2"(表示輸出第二個(gè)數(shù))echo " $($1+$2)"(輸出兩數(shù)之和)echo "$1-$2"(輸出兩數(shù)之差)echo "$1*$2"(輸出兩數(shù)之積)echo "$1/$2"(輸出兩數(shù)之商):wqvi 編輯器)chmod +x test.shtest.sh 執(zhí)行的權(quán)限)./test.sh 2 3(傳遞兩個(gè)參數(shù)并執(zhí)行腳本作業(yè)一:寫一個(gè)腳本:1. 創(chuàng)建目錄/tmp/scripts2. 切換工作目錄至此目錄中

7、3. 復(fù)制 /etc/pam.d 目錄至當(dāng)前目錄,并重命名為test4. 將當(dāng)前目錄的test 及其里面的文件和子目錄的屬主改為redhat5. 將 test 及其子目錄中的文件的其它用戶的權(quán)限改為沒有任何權(quán)限答案:#!/bin/bashmkdir -v /tmp/scriptscd /tmp/scriptscp -r /etc/pam.d ./testchown -R redhat ./testchmod -R o=- ./test作業(yè)二:寫一個(gè)腳本1. 顯示當(dāng)前系統(tǒng)日期和時(shí)間,而后創(chuàng)建目錄/tmp/lstest2. 切換工作目錄至/tmp/lstest3. 創(chuàng)建目錄a1d , b56e ,

8、 6test4. 創(chuàng)建空文件xy, x2y , 7325. 列出當(dāng)前目錄下以a, x 或者 6 開頭的文件或目錄6. 列出當(dāng)前目錄下以字母開頭,后跟一個(gè)任意數(shù)字,而后跟任意長(zhǎng)度字符的文件或目錄答案:#!/bin/bashdatemkdir -pv /tmp/lstestcd /tmp/lstestmkdir a1d b56e 6testtouch xy x2y 732ls ax6*ls :alpha:digit:*作業(yè)三:寫一個(gè)腳本添加 10 個(gè)用戶 user1 到 user10 ,但要求只有用戶不存在的情況下才能添加答案:#!/bin/bashfor I in 'seq 1 10&#

9、39;docut -d: -f1 /etc/passwd |grep "user$I" 2>>/tmp/etc.err |useradd user$Idone作業(yè)四:寫一個(gè)腳本通過 ping 命令測(cè)試192.168.0.151 到 192.168.0.254 之間的所有主機(jī)是否在線如果在線,就顯示“ip is up ”如果不在線,就顯示“ip is down ”答案: #!/bin/bashfor I in 'seq 151 254'doping -c1 -w1 192.168.0.$I &>/dev/null &&

10、 echo "192.168.0.$I isup" | echo "192.168.0.$I is down"done例題:shell1.sh 顯示日期和時(shí)間。#!/bin/bashecho “ current time is 'date'” /date 要加反引號(hào)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 ,依次類推。)#!/bi

11、n/bashecho “ the program name is $0”/ $0 是一個(gè)特殊的變數(shù)/ $1 是一個(gè)位置參數(shù)echo “ the first para is $1如 ./shell2.shecho “ the program exit ”/ 執(zhí)行時(shí)帶一個(gè)參數(shù)abcdshell3.sh 判斷并顯示位置參數(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í)

12、行時(shí)帶一個(gè)參數(shù)shell4.sh 問候用戶#!/bin/bashuser='whoami'case $user inteacher)echohello teacherroot)echo “ hello root ” ;*)echo “ hello $user,welcome ”esac1 、 求1+2+3+.+100 的和是?#!/bin/bashSUM=0I=0while $I -le 100 doSUM=$(SUM+I)I=$(I+1)doneecho " 由 1+2+3+.+100 的和是 :$SUM"2 、 (基訓(xùn)十一) 在根目錄下有四個(gè)文件m1.t

13、xt , m2.txt , m3.txt ,m4.txt ,用 Shell 編程,實(shí)現(xiàn)自動(dòng)創(chuàng)建m1,m2,m3,m4 四個(gè)目錄,并將 m1.txt,m2.txt,m3.txt,m4.txt 四個(gè)文件分別拷貝到各自相應(yīng)的目錄下#!/bin/bash cd /touch m1.txt m2.txt m3.txt m4.txtI=1while $I -le 4 domkdir m$Icp m$I.txt m$II=$(I+1)done3 、 (基訓(xùn)十二) 編寫一個(gè)名為myfirstshell.sh 的腳本,它包括以下內(nèi)容。 a) 包含一段注釋,列出您的姓名、腳本的名稱和編寫這個(gè)腳本的目的。b) 問候

14、用戶。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) 跟用戶說(shuō)“Good bye ”#!/bin/bash# 09 嵌入 5 號(hào) 賈德進(jìn) myfirstshell.sh shelluser='whoami'case $user inroot)echo "hello root"teacher)ech

15、o "hello teacher"*)echo "hello $user,welcome"esacecho "日期和時(shí)間:'date'"echo "本月的日歷:'cal'"echo " 本機(jī)的機(jī)器名:'uname -n'"echo " 當(dāng)前這個(gè)操作系統(tǒng)的名稱和版本:'unameecho " 父目錄中的所有文件的列表:'ls ./'"的簡(jiǎn)單編程-s;uname -r'echo "

16、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è)目錄,即useri us

17、er50 ,并設(shè)置每個(gè)目錄的權(quán)限為 rwxr-xr 一#!/bin/bashcd /userdataI=1while $I -le 50 domkdir -p userdata/user$Ichmod o-x user$II=$(I+1) done5 、 (基訓(xùn)十四) 編寫 shell 程序, 實(shí)現(xiàn)自動(dòng)刪除50 個(gè)用戶賬號(hào)的功能。賬號(hào)名為stud1 至 stud50 。#!/bin/bash cd /userdataI=1while $I -le 50 domkdir -p userdata/user$Ichmod o-x user$II=$(I+1)done6 、 (基訓(xùn)十四) 設(shè)計(jì)一個(gè)sh

18、ell 程序,備份并壓縮/etc 目錄的所有內(nèi)容,存放在 /root/bak 目錄里, 且文件名為如下形式y(tǒng)ymmdd_etc , yy 為年, mm 為月,dd 為日。#!/bin/bashDIRNAME='ls |root|grep bak 'if -z $DIRNAME ; thenmkdir /root/bakcd /root/bakfiYY='date + %y'MM='date + %m'DD='date + %d'tar czvf $YY$MM$DD_etc.gz /etc echo "etc bak fi

19、nshied"7 、 ( 基訓(xùn)十四) 某系統(tǒng)管理員需每天做一定的重復(fù)工作,請(qǐng)按照下列要求,編制一個(gè)解決方案:( 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 目 錄 下 的 所 有 目 錄 和 文

20、 件 歸 檔 并 壓 縮 為 文 件 :backup.tar.gz;50 17 * tar czvf back.tar.gz /data#(3) 在下午 5:55 將 IDE 接口的第二個(gè)邏輯分區(qū)卸載.55 17 * umount /dev/hda6/ 執(zhí)行: crontab pram.cron 設(shè)計(jì)一個(gè)Shell程序,在/userdata 目錄下建立50個(gè)目錄,即useriuser50 ,并設(shè)置 每個(gè)目錄的權(quán)限,其中其他用戶的權(quán)限為:讀;文件所有者的權(quán)限為:讀、寫、執(zhí)行;文件 所有者所在組的權(quán)限為:讀、執(zhí)行。程序?qū)崿F(xiàn)及注釋如下:#! /bin/bash#adddir.sh i=1#while

21、循環(huán)while $i -le 50 do#利用test命令-d/userdata :判斷/userdata 是否存在,如果存在直接創(chuàng)建子目錄, 不#存在先創(chuàng)建/userdata再創(chuàng)建子目錄。if -d /userdata then#mkdir-p的意思是:無(wú)論父目錄/userdata存在與否,都會(huì)創(chuàng)建/userdata/user$imkdir -p /userdata/user$ielsemkdir /userdatamkdir -p /userdata/user$ifi#根據(jù)題目的意思:/userdata/user$i 應(yīng)該是具有754權(quán)限,所以利用 chmod賦權(quán)限。chmod 754 /

22、userdata/user$ii=$($i+1) done函數(shù)in_path :判斷傳入文件是否可執(zhí)行,若可執(zhí)行(且存在)返回0,否則返回1;分析:為測(cè)試傳入文件是否在PATH所有的目錄中,需取得 PATH中的每個(gè)路徑,可用循環(huán),但需要設(shè)定環(huán)境中的分隔符(借助環(huán)境變量IFS)為PATH中的分隔符冒號(hào)“:"注:$IFS輸入分隔符.當(dāng)shell讀取輸入數(shù)據(jù)的時(shí)候,會(huì)把一組字符看做是單詞之間的分隔字符,它們通常是空格,制表符,和換行符.函數(shù)調(diào)用方式為:in_path filenamein_path()cmd=$1# $1為函數(shù)的參數(shù)1 ,以此類推retval=1#定義返回值變量oldIFS

23、=$IFSIFS=:#設(shè)置新的IFS,并保存原來(lái)的以恢復(fù)使用for directory in $PATH#for 循環(huán)結(jié)構(gòu)二:for - indoif -x directory/$cmd ; then#if條件語(yǔ)句之 同行表示 以分號(hào)隔開retval=0# -x判斷文件有是否有可執(zhí)行權(quán)限done doneIFS=$oldIFS#恢復(fù)原來(lái) IFS,return retval 注:1.函數(shù)的結(jié)構(gòu),沒有形參2 .變量的引用需要符號(hào)$,而變量的定義或賦值則不需要。3 .賦值要無(wú)間隙,條件要間隙改進(jìn):1.將路徑、分隔符均作為函數(shù)的參數(shù)傳入,應(yīng)用得到擴(kuò)展。補(bǔ)充,in_path函數(shù)不能對(duì)絕對(duì)路徑的文件處理,

24、需寫個(gè)函數(shù)對(duì)這一情況單獨(dú)處理 checkForCmdInPath() var=$1#首先判斷傳入的非空串是否為絕對(duì)路徑,即檢測(cè)第一個(gè)字符是不是"/",如果是7域接測(cè)if $var !="" ; then # 條件等價(jià)于-n $varif " $var%$var#?" = then ;#等價(jià)于 $(echo $var | cut -c1)if ! -x $var ; thenreturn 1#not found or not executablefielif ! inpath $var ; then return 2#not found

25、 in PATHfi fi 注:此函數(shù)讓人一頭霧水,詳解如下:1) 表達(dá)式$var%$ var#? 作匹配用,分解為 $var%expr $var#expr , expr為正則表達(dá)式(?匹 配單一字符)后者(帶#的)返回expr與var匹配成功位置之后的所有內(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的符號(hào)放在外面了,假設(shè) $var為$1,則

26、表達(dá)式表示為 $1%$1#?2)關(guān)于if的條件判斷與C語(yǔ)言中的理解不一致,反映在上述的elif語(yǔ)句中的條件。理解如下:shell中的if條件可以是 表達(dá)式(需加方括號(hào)口),另外還可以是命令或函數(shù)(不需方括號(hào)),當(dāng)命令執(zhí)行成功時(shí)會(huì)后繼執(zhí)行具體操作,經(jīng)測(cè)試,C語(yǔ)言中所說(shuō)的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ù)的編寫若遵從以上的原則,則對(duì)條件的理解 依舊像C語(yǔ)言中的TRUE,FALSE 一樣理解=完善程序代碼=#!/bin/bashin_path().#函數(shù)實(shí)現(xiàn)區(qū)域

27、 處理不路徑返回0表找到、可執(zhí)行,否則返回1#checkForCmdInPath().#函數(shù)實(shí)現(xiàn)區(qū)域 沒找到。默認(rèn)0表找到處理帶路徑和不帶路徑的返回1表沒找到或不可執(zhí)行, 返回2表#代碼執(zhí)行起始位置#if $# -nq 1 ; thenecho “ Usage: $0 command ”行此文件時(shí)的輸入串為準(zhǔn))exit 0fi#調(diào)用函數(shù),并經(jīng)第一個(gè)參數(shù)傳給函數(shù)checkForCmdInpath $1#$0表此執(zhí)行文件(具體內(nèi)容 以 執(zhí)#對(duì)函數(shù)返回的結(jié)果進(jìn)行判斷$? 為函數(shù)的返回值,case $? in# case 控制結(jié)構(gòu)的格式,注意紅色部分。0)1)2)defaultechofound in

28、 PATH;echo “not found or not executable;”echo "not found "#*);類似于 C 語(yǔ)言中的2 .寫一個(gè)腳本,檢測(cè)用戶輸入串的合法性,要求串由大小寫字母、數(shù)字組成,無(wú)標(biāo)點(diǎn)、特殊符號(hào)、空格。思路:將輸入的串中非字母數(shù)字的內(nèi)容刪除或替換為空后若和原來(lái)輸入的相同則合法,否則不合法。isvalidAlphaNum() ( compressed= " $(echo $1 | sed 's/A:alnum:/g')#替換不合要求字符為空if “ $compressed " !=" $1 &

29、quot; ; thenreturn 1# not valideelsereturn 0# validefi )注:1.關(guān)于引用變量時(shí)是否需要雙引號(hào)的說(shuō)明 如果只是輸出,可以不用雙引號(hào)如果變量值代的內(nèi)容中無(wú)空格,表達(dá),特殊符號(hào),在引用時(shí)可以不需要雙引號(hào),反之,最好帶雙引 號(hào),否則在變量處理時(shí)很有可能會(huì)出現(xiàn)“參數(shù)過多”等莫名其妙的錯(cuò)誤信息。2.關(guān)于匹配處理,sed是單行編輯程序。sed ' s/str1/str2/g 'file 將文件file中每行內(nèi)str1替換為str2:alnum:表示所有字母和數(shù)字中的任一個(gè)字符。若只是:alnum:則表示方括號(hào)中的任一個(gè)字符。A:alnu

30、m:表除了所有字母數(shù)字外的任一字符。如果是直接向腳本傳字符串,則帶空格的字串會(huì)被腳本自行分解為多個(gè)參數(shù),所以可采用從標(biāo)準(zhǔn)輸入讀取 的方式獲得字串。=完善程序代碼=#!/bin/bashisvalidAlphaNum().#函數(shù)體,判斷字串的合法性echo -n " Enter input:# -n強(qiáng)制不換行read input#讀取內(nèi)容存到input中,無(wú)$符號(hào)if ! isvalidAlphaNum" &input ” ; then#加引號(hào),否則可能會(huì)出錯(cuò)。echo “ invalide ” exit 1elseecho “ valide ” fiexit 03

31、輸入一個(gè)“ month day year ”格式的日期串,程序?qū)⑻幚怼眒onth 其英文單詞 ”為的前三個(gè)字母,第一個(gè)字母大寫,其余的小寫。思路: 首先判斷month 是數(shù)字、 還是單詞,若是數(shù)字,則可查 “數(shù)字 month ” 映射表 (自定義 case 結(jié)構(gòu)) ;若是單詞,則取前三個(gè)字母,并格式化。函數(shù) monthnoToName () 將 month 數(shù)字轉(zhuǎn)換為month 名monthnoToName() case $1 in1 ) month="Jan" 2 ) month="Feb"3 ) month="Mar" 4 ) m

32、onth="Apr"5 ) month="May" ; 6 ) month="Jun"7 ) month="Jul" ; 8 ) month="Aug" ;9 ) month="Sep" ;10) month="Oct" ;11) month="Nov" ;12) month="Dec" ;* ) echo "$0: Unknown numeric month value $1" >&

33、;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”exit 1fi#判斷參數(shù)1 是數(shù)字還是單詞,方法替換串中所有數(shù)字,若結(jié)果為空,則為數(shù)字,否則為單詞。if - n $(echo $1 | sed :dsig/it: / g ) # -n 檢測(cè)串是為空thenmonthnoToName $1# 數(shù)字else# 取第一個(gè)字母并將其變?yōu)榇髮?,再將結(jié)果與取出的第二三字母組合m

34、onth= " $(echo $1 | cut cl | tr ':lower:' ':upper:')month= ” $month$(echo $1 | cut -c2- 3 | tr ':upper:' ':lower:')fi# 輸出結(jié)果echo $month $2 $3exit 0注: 1. 外圍可以使用函數(shù)中定義的變量, 如函數(shù) monthnoToName 中定義的month 變量,最后 echo 會(huì)用到它。2. 多管道(| )的使用3. month變量的合并,$var$var4. tr SET1 SET2

35、轉(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 's/ -/g')。 set的-命令可以將其后的參數(shù)賦予位置參數(shù)($1,$2,.)。鏈接set指令用法4. 格式化輸出大數(shù)字,使輸出結(jié)果更容易讓人知道該輸出數(shù)字的數(shù)量級(jí)。默認(rèn)用逗號(hào)分隔整數(shù)部分,用點(diǎn)號(hào)分隔整數(shù)與小數(shù)部分,當(dāng)然用戶也可以使用-d指定整數(shù)的分隔符,用-t

36、 指定整數(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ù)字來(lái)處理%運(yùn)算/ 運(yùn)算1 )每次取整數(shù)低三位,長(zhǎng)度小于3 就補(bǔ)前綴0(避免出現(xiàn)漏0 情況,例如低三位為 003 時(shí),取后便為值3)2 )將此次得到的三位與上一次得到的三位用分隔符(如果沒有指定就默認(rèn))組合起來(lái)。3 )整數(shù)去掉低三位,繼續(xù)操作1 ) 。當(dāng)此整數(shù)小于等于999 就不再繼續(xù)。當(dāng)字串來(lái)處理: 1

37、)每次取低三位,cut - c $($#str - 2)-$#str$#str 為 str 的長(zhǎng)度,必須為大括號(hào) 。$( ) 的內(nèi)部為str 長(zhǎng)度 -2 ,代表倒數(shù)低三個(gè)字符。因?yàn)閮?nèi)部是減法,所有此為 雙小括號(hào)。2 )原串每次都要裁掉尾部三個(gè)字符,每次取到的字串的長(zhǎng)度為循環(huán)判斷條件。函數(shù) nicenumber() 作如上處理nicenumber()# 傳入 integer.decimal 如 2000023.2 ,32232332 等# 分別取 整數(shù)部分和小數(shù)部分integer=$(echo $1 | cut- d. - f1)decimal=$(echo $1 ! cut- d. - f2)

38、# 判斷小數(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=$DD$decimal# 在小數(shù)部分前加分隔符。fi thousand=$integerwhile thousand - gt 999 doremainder=$(thousand%1000)while $#remaind

39、er - It 3 ;do remainder 串的長(zhǎng)度remainder=0$remainder時(shí)的丟 0 情況。 done#$#remainder# 避免 remainder為 00xthousand=$($thousand/1000)#以下四句可用一句表示:result=$TD:” = ” , ” $remainder$result# 上面藍(lán)色部分表:若TD 非空則返回TD ,否則將”, ”賦給 TD.if -z $TD ; then#判斷用戶是否自定義整數(shù)分隔符若空TD=, fi result= ” $TD$remainder$result 順序doneif - n $thousand

40、 ; then result=” $thousand$resultelif $result%$result#? =result=” $result#? ”fi echo $result”# 與分隔符合成串。注意# 若 非空”“ $TD” ; then腳本標(biāo)志參數(shù)處理命令:getopts “” var帶兩個(gè)參數(shù),第一個(gè)參數(shù)為帶解析的參數(shù)標(biāo)志序列串(如-f,-c 等) , 以冒號(hào)(:)分隔各標(biāo)志,且以冒號(hào):結(jié)束第二個(gè)參數(shù)為:變量,每執(zhí)行一次存放參數(shù)標(biāo)志序列串中的一個(gè)標(biāo)志字符返回值:未解析結(jié)束返回0 ,解析結(jié)束返回1涉及的內(nèi)定變量:$OPTARG 每次解析標(biāo)志對(duì)應(yīng)的參數(shù)值便默認(rèn)存放在此變量?jī)?nèi)。$OP

41、TIND 當(dāng)各標(biāo)志處理無(wú)誤情況下,該數(shù)值指示當(dāng)前用到的此值使用容易出錯(cuò)(若參數(shù)的判斷不完善時(shí)), 還不如用=> 此時(shí) $# 等于 4,各個(gè)位置參數(shù)的值向一次向左右1 次,此時(shí)$1 的值 為原各個(gè)位置參數(shù)的值向一次向左右2 次,此時(shí)$1 的值 為原最大位置參數(shù)($# ) 。$#另外 $1, $2, $3, $4, 當(dāng)執(zhí)行shift 1 時(shí),$2 的值當(dāng)執(zhí)行shift 2 時(shí),$3 的值。完整代碼 nicenumber.shnicenumber()# 函數(shù)實(shí)現(xiàn)部分#處理腳本標(biāo)志參數(shù)while getopts “ d:t: op”tdocase $opt in# $opt為 具體的標(biāo)志字符d

42、) 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. 不同國(guó)家整數(shù)與小數(shù)的分隔符不同,使腳本能夠處理各種整數(shù)與小數(shù)各種分隔符情況。在傳給腳本參數(shù)時(shí)需指定標(biāo)志-d程序中僅需在分隔 整數(shù)與小數(shù)部分略修改為integer=$(echo $1 | cut"-

43、d$DD:= " .f1 )”-decimal=$(echo $1 | cut"- d$DDf2 )-2. 另外,可以在程序執(zhí)行之前分別初始化DD,TD 默認(rèn)值。3. 檢測(cè)傳給腳本的大數(shù)值中是否含有非法的整小數(shù)分隔符,即存在與用戶指定或默認(rèn)分隔符不同的符號(hào)。方法:刪除其中所有數(shù)字,看剩下的內(nèi)容,若不空且不等于$DD ,則非法separator= ” $(echo $1 | sed s/:digit:/g ) ”if -n $separator &&“ $separator ” !=“ $DD” ;then # 藍(lán)色部分可用 一a表不exit 1fi5.檢測(cè)輸

44、入整數(shù)的合法性,可負(fù)數(shù)(-1,-2均合法),可以指定傳入整數(shù)范圍,不在 范圍內(nèi)則報(bào)錯(cuò)。參數(shù):1或3個(gè),當(dāng)3個(gè)時(shí),后兩個(gè)為范圍。 合法性:正負(fù)數(shù)的判斷,范圍的判斷。validint() integer=$1min=$2 max=$3#判斷傳參的合法性,以下判斷是錯(cuò)誤的,因?yàn)椴还軈?shù)是否為空,實(shí)際上都傳了 三個(gè)參數(shù)。if $# -eq 0 ;then#改成判斷$1的內(nèi)容是否為空,就可以echo" you couldnt do nothing" &2 return 1- fi# 判斷是否為負(fù)數(shù),第一個(gè)字符是否為-,如是,則判斷后面的是否為整數(shù)。若非負(fù),則判斷是否為整數(shù)if

45、 “ $(echo $1 | cut- c1>'" =thensigned= - integer= " $integer#? “fi# 如果就是一個(gè)符號(hào)-,則也是非法的if - z " $integer " ; thenecho “Invalid input, just a -" is not allowed&2 >#注意:>&2 三個(gè)字符緊連。return 1fi# 如果非純數(shù)字構(gòu)成,則非法。if - n " $(echo $integer | sed' s/:digit:g' ) ” ; thenecho “Invalid integer, it includes some char but digit” >&2return 1fiinteger= " $signed$integer ”#范圍判斷,注意當(dāng) min和max為空時(shí)(即未傳范圍),我設(shè)定其為$integer,如此判斷就不會(huì)出錯(cuò)。if $integer - It $

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論