版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
Shell編程09榆林職業(yè)技術學院楊浩Linux系統(tǒng)基礎與應用實踐1學習目標1.會使用基本正則表達式。2.掌握cut、awk字符串截取命令、sed輕量級編輯工具以及printf格式化輸出命令的基本使用方法。3.熟練掌握排序命令sort、統(tǒng)計命令wc等字符串處理命令的使用方法。4.熟練掌握條件判斷命令和多重條件判斷命令的使用方法。5.熟練掌握單分支、兩分支、多分支if選擇語句的使用方法。6.熟練掌握case多分支選擇語句的使用方法。7.熟練掌握for循環(huán)語句、while循環(huán)語句和until循環(huán)語句的使用方法。本章學習目標29.1正則表達式39.1.1正則表達式與通配符
通配符是用于匹配文件名的,是對文件進行批量操作的。
如:#顯示以“zheng”開頭的任意長度的文件名:[root@localhosttemp]#lszheng*#顯示以“zheng”開頭、長度為6、第六個字符為任意字符的文件名:[root@localhosttemp]#lszheng?#顯示以“zhengze”開頭、長度為8、第八個字符為“1”或者“2”或者“3”的文件名:[root@localhosttemp]#lszhengze[123]
正則表達式是對文件內(nèi)容操作時,用來匹配文件中的字符串的。
比如,grep、awk、sed等命令都是處理文件內(nèi)容的,都支持正則表達式,用于在文件中查找滿足一定條件內(nèi)容。9.1正則表達式49.1.1基本正則表達式shell編程中有基本正則表達式和擴展正則表達式,本書只介紹基本正則表達式,其符號和功能如下表所示。符號功能*表示*前的這個字符匹配任意多次(包括0次)。如:s*,0個或任意多個的“s”。.匹配除換行符以外的其它任意一個字符如:b.*h,表示以“b”開頭、以“h”結(jié)尾、且中間為任意多個任意字符的字符串。^匹配以^后第一個字符串開頭的行。如:^ruler,表示以“ruler”開頭的行。$匹配以符號“$”前第一個字符串結(jié)尾的行。如:ruler$,表示以“ruler”結(jié)尾的行。符號功能[]匹配括號中的任意一個字符(但不匹配回車符)。如:[ruler],表示匹配“ruler”這五個字符中的任何一個;[1-9],表示匹配1-9中九個數(shù)字的任何一個數(shù)字;[1-9][A-Z],表示表示匹配兩個字符,第一個字符是1-9中的任何數(shù)字,第二個字符是任何一個大寫字母。[^]取反,匹配除括號中字符以外的任何字符。如:[^0-9]表示匹配除0-9之外的任意字符。\轉(zhuǎn)義字符。\{n\}表示其前面的字符出現(xiàn)n次。如:[a-z]\{5\}表示任意5個小寫字母。[1][3-9][0-9]\{9\},表示手機號碼,第一位是1,第二位是3-9的任意數(shù)字,后九位數(shù)是任意數(shù)字。\{n,\}表示其前面的字符至少出現(xiàn)n次。如:[135]\{3,\}表示由1,3,5組成的任意三位或以上位數(shù)的數(shù)字。\{n,m\}表示其前面的字符至少出現(xiàn)n次,最多出現(xiàn)m次。如:[a-z]\{6,8\}表示匹配6-8位的任意小寫字母。9.1正則表達式59.1.1基本正則表達式
例9.1可用如下命令在ruler文件中查找至少包含兩個連續(xù)“o”字符的行:[root@localhosttemp]#grep“ooo*”ruler
例9.2在ruler文件中查找包含第一個字符為“r”、第四個字符為“t”、第二、第三個字符為任意字符的字符串的行,可用如下命令:[root@localhosttemp]#grep”r..t”ruler
例9.3在ruler文件中查找包含第一個字符為“p”、最后一個字符為“n”的字符串的行,可用如下命令:[root@localhosttemp]#grep”p.*n”ruler
例9.4可用如下命令在ruler文件中查找空行,并返回行號:[root@localhosttemp]#grep-n”^$”ruler
例9.5可用如下命令在ruler文件中查找以非數(shù)字開頭的行,并返回行號:[root@localhosttemp]#grep-n“^[^0-9]”ruler
例9.6可用如下命令在ruler文件中查找不以字母開頭的行:[root@localhosttemp]#grep“^[^a-zA-Z]”ruler
例9.7可用如下命令在ruler文件中查找以“$”結(jié)尾的行:[root@localhosttemp]#grep“\$$”ruler
例9.8在ruler文件中查找包含以“y”開頭、“t”結(jié)尾、中間是連續(xù)1-2個字母“a”的字符串的行,可用如下命令:[root@localhosttemp]#grep“ya\{1,2\}t”ruler9.2字符截取命令69.2.1cut字符提取命令cut命令的完整路徑是/bin,任何用戶都有權(quán)限執(zhí)行,其功能是用于提取文件中指定的列。
命令格式:[root@localhosttemp]#cut[-f列號|-d分隔符]文件名
選項說明:-f列號
提取指定的列,若要提取多列,用“,”分割各列。-d符號
按照指定符號分割列,默認分割符是tab鍵,分隔符必須是單一的一個字符,如,當以空格作為分隔符時,如果用戶不慎輸入連續(xù)的多個空格符時,只把第一個空格符作為分隔符。所以對于將多個空格符作為字段分隔符的情況,就難于用cut命來提取字段。
以下是/temp/cut-studentinfo.txt文件的內(nèi)容,本節(jié)部分實驗和例題以該文件為例:ID NAME
SEX
AGE DEPARTMENT01 Lining
M
18 computer02 Maoling
W
20 english03 Yangmin
M
21 math04WanghongM
19 physical注意:每條記錄的字段之間一定用tab鍵作為分割。9.2字符截取命令79.2.1cut字符提取命令
例9.9可用如下命令提取cut-studentinfo.txt文件中的姓名(第二列)和年齡(第四列):[root@localhosttemp]#cut–f2,4cut-studentinfo.txt
執(zhí)行結(jié)果為:NAME AGE Lining 18 Maoling 20 Yangmin 21 Wanghong19
例9.10可用如下命令提取/etc/passwd文件的第一列和第五列[root@localhosttemp]#cut–f1,5–d:/etc/passwd#passwd文件中各列之間用“:”分隔
顯示結(jié)果:(略)
例9.11可用如下命令提取cut-studentinfo.txt文件中的第三行的第五列:[root@localhosttemp]#grepMaolingcut-studentinfo.txt|cut–f5
顯示結(jié)果:english9.2字符截取命令89.2.2格式化輸出命令printfprintf命令是字符串截取命令awk的標準輸出調(diào)用命令。printf命令的完整目錄是/bin,所有用戶都有權(quán)限執(zhí)行,其功能是將指定內(nèi)容按指定格式輸出到屏幕。
命令格式:[root@localhosttemp]#printf‘[選項1][選項2]’輸出內(nèi)容選項說明:
選項1指定輸出類型,各選項功能如下:%ns輸出字符串。n是整數(shù),其絕對值為輸出寬度,n>0右對齊,n<0左對齊。%ni輸出整數(shù)。n是整數(shù),其絕對值為輸出寬度,n>0右對齊,n<0左對齊。%n.mf輸出浮點數(shù),.m指定小數(shù)位數(shù),n是整數(shù),n的絕對值為輸出寬度,n>0右對齊,n<0左對齊。選項2指定輸出格式,各選項功能如下:\a輸出警告聲音\b輸出退格鍵\f清除屏幕\n換行\(zhòng)r回車\t水平輸出退格鍵即tab鍵\v垂直輸出退格鍵。9.2字符截取命令99.2.2格式化輸出命令printf
例9.12可用如下命令按下列要求輸出a-l字母序列:a b c d e f g hi j k l[root@localhosttemp]#printf‘%s\t%s\t%s\t%s\n’abcdefghijkl
注意:命令中的單引號不能用雙引號替代,a-l字母序列均為命令參數(shù)要用空格分割。
例9.13可用如下命令輸出小數(shù)12.3和45.6,輸出寬度為8,保留2位小數(shù),左對齊:[root@localhosttemp]#printf'%-8.2f%-8.2f\n'12.345.6執(zhí)行結(jié)果:12.3045.60
例9.14可用如下命令輸出cut-studentinfo.txt文件的內(nèi)容[root@localhosttemp]#printf‘%s\t%s\t%s\t%s\t%s\n’$(catcut-studentinfo.txt)
執(zhí)行結(jié)果:IDNAMESEXAGEDEPARTMENT01LiningM18computer02MaolingW20english03YangminM21math04wanghongM19physical
本例中,“‘%s\t%s\t%s\t%s\t%s\n’”,共包含5組輸出控制符,使指定輸出內(nèi)容按從頭到尾的順序,每行輸出5個字段,“$(catcut-studentinfo.txt)”將文件cut-studentinfo.txt的內(nèi)容以流字符串的形式作為Printf的輸出內(nèi)容。9.2字符截取命令109.2.3awk命令1.a(chǎn)wk基本命令格式awk也是列截取命令,具有比cut更加強大的字符串截取功能,可以處理以多個空格分割字段的情況,可以定義函數(shù)、調(diào)用格式化輸出等命令。awk命令的完整路徑是/bin,所有用戶都有權(quán)限執(zhí)行
。
命令格式:[root@localhosttemp]#awk‘[條件1]{動作1}[條件2]{動作2}……’文件名
命令中的條件一般為邏輯表達式,動作為格式化輸出語句或流程控制語句,若條件1成立,則執(zhí)行動作1,否則不執(zhí)行,若條件2成立,則執(zhí)行動作2,否則不執(zhí)行,順序掃碼執(zhí)行。
例9.15可用如下命令輸出cut-studentinfo.txt的第二列和第五列[root@localhosttemp]#awk'{printf$2"\t"$5"\n"}'cut-studentinfo.txt
執(zhí)行結(jié)果為:NAMEDEPARTMENTLining computerMaoling englishYangmin mathWanghongphysical
命令中沒有動作執(zhí)行條件,缺省表示任何條件下都執(zhí)行指定動作;其中的“$2”和“$5”指定輸出的內(nèi)容為cut-studentinfo.txt文件中的第二列和第五列;“\t”和“\n”為輸出格式控制符,要用雙引號標記(命令中的動作語句已經(jīng)使用了單引號)。9.2字符截取命令119.2.3awk命令1.a(chǎn)wk基本命令格式
例9.16可用如下命令輸出系統(tǒng)分區(qū)信息的第一列和第五列[root@localhosttemp]#df-h|awk'{print$1"\t"$5}'
執(zhí)行結(jié)果:FilesystemUse%/dev/mapper/VolGroup-lv_root5%tmpfs0%/dev/sda18%結(jié)果說明:awk支持管道輸出,命令中把管道輸出作為awk的操作內(nèi)容;對于空格作為字段分隔符的情況,cut只支持把單個空格作為字段分隔符,awk支持把連續(xù)的空格(長度不定)作為字段分隔符,所以可以操作將空格作為分隔符的分區(qū)信息。命令中的動作命令使用了print命令,自帶輸出結(jié)束換行功能,而printf命令沒有自換行功能。
例9.17可用如下命令提取分區(qū)信息中分區(qū)sda1的使用率的百分數(shù)8:[root@localhosttemp]#df-h|grepsda1|awk'{print$5}'|cut-f1-d%
執(zhí)行結(jié)果為:89.2字符截取命令129.2.3awk命令2.BEGIN和ENDBEGIN和END分別用于指定執(zhí)行awk命令時,需要首先執(zhí)行的指令和最后執(zhí)行的指令。
例9.18輸出cut-studentinfo.txt文件的第二、三和五列,同時在文件首部輸出“Thefollowingisinformationofstudents:”,在末尾輸出“THEEND.”:[root@localhosttemp]#awk'BEGIN{printf"Thefollowingisinformation\ofstudents:\n"}{print$2"\t"$3"\t"$5}END{print"THEEND."}'cut-studentinfo.txt
執(zhí)行結(jié)果為:Thefollowingisinformationofstudents:NAMESEXDEPARTMENTLiningMcomputerMaolingWenglishYangminMmathWanghongMphysicalTHEEND.BEGIN指定首先執(zhí)行其后第一個括號中輸出命令,END指定最后執(zhí)行其后括號中的輸出命令9.2字符截取命令139.2.3awk命令3.FS內(nèi)置變量awk能識別的分隔符是tab鍵和空格,F(xiàn)S用于指定其它符號的分隔符。
例9.19請輸出/etc/passwd文件中以“bash”結(jié)尾的所有行的第一列、第三列和第七列。分析:由于/etc/passwd文件中字段間是用“:”為分隔符的,而不是awk默認的分隔符(tab鍵或空格),所以需要用FS內(nèi)置變量指定分隔符為:“:”,執(zhí)行命令如下:[root@localhosttemp]#cat/etc/passwd|grepbash$|awk'{FS=":"}{print$1"\t"$3"\t"$7}'
執(zhí)行結(jié)果為:root:x:0:0:root:/root:/bin/bashyh500/bin/bashyh1501/bin/bashmember1502/bin/bash……
結(jié)果分析:
我們發(fā)現(xiàn)第一行并沒有按要求輸出,而是把文件passwd中的第一行全部輸出,原因是awk先輸出第一行內(nèi)容,然后才讀“{FS=‘:’}”相關的內(nèi)容,所以從第二行開始,才按要求輸出了結(jié)果。所以做如下改進:在“{FS=‘:’}”前加“BEGIN”關鍵字,讓awk命令首先就讀取“{FS=‘:’}”:[root@localhosttemp]#cat/etc/passwd|grepbash$|awk/'BEGIN{FS=":"}{print$1"\t"$3"\t"$7}'\
執(zhí)行結(jié)果:root0/bin/bashyh500/bin/bashyh1501/bin/bashmember1502/bin/bash……
這樣,就符合題目的輸出要求了。9.2字符截取命令149.2.3awk命令4.條件執(zhí)行
前述列舉的awk命令實例,都是無條件執(zhí)行,下面通過實例,介紹awk命令中的條件執(zhí)行,當條件成熟時,則執(zhí)行其后的動作。
例9.20可用如下命令截取/tmp/temp/cut-studentinfo.txt文件中年齡大于19歲的所有學生的姓名、年齡和專業(yè),但不打印標題行:[root@localhosttemp]#catcut-stuedntinfo.txt|grep-vNAME|awk'$4>19{print$2"\t"\$4"\t"$5}‘執(zhí)行結(jié)果:Maoling20englishYangmin21math
結(jié)果分析:其中,“grep-vNAME”命令把/tmp/temp/cut-studentinfo.txt文件的標題行篩選掉了,否則,在執(zhí)行“awk'$4>19……”命令時會報錯,因為標題行的第四個字段是“AGE”,不能比較大小。9.2字符截取命令159.2.3sed命令sed命令是一個輕量級的流編輯工具。vi或vim只能編輯文件內(nèi)容,而不能直接編輯特定命令(如df-h)的輸出結(jié)果。sed命令除了主要編輯命令的輸出結(jié)果外,還可以以命令的方式對文件內(nèi)容進行操作。在編輯命令的輸出結(jié)果時,sed命令可以通過管道接收命令的輸出。
命令格式:[root@localhosttemp]#sed[選項]‘[動作]’文件名
選項說明:-n缺省情況下,sed命令把所有數(shù)據(jù)全部輸出到屏幕,該選項輸出指定行。-e允許用多條sed命令對輸入數(shù)據(jù)進行編輯。-i將sed命令的修改結(jié)果直接作用于讀取數(shù)據(jù)的文件,而不是由屏幕輸出。
動作說明:
執(zhí)行的動作必須要用單引號標記。執(zhí)行多行時,除了最后一行外,每行結(jié)尾添加“\”符號,表示數(shù)據(jù)未結(jié)束。a追加(append),在當前行后添加一個或多個新行。c行替換,用c后面的字符串替換原數(shù)據(jù)行。i插入行(insert),在當前行插入一個或多個新行。d
刪除指定行。p
打印輸出指定行。s
字符串替換,用一個字符串替換另一個字符串。格式為:“行范圍s/舊字符串/新字符串/g”。9.2字符截取命令169.2.3sed命令
例9.21可用如下命令輸出cut-studentinfo.txt文件的標題行(即第一行):[root@localhosttemp]#sed-n'1p'cut-studentinfo.txt
執(zhí)行結(jié)果為IDNAMESEXAGEDEPARTMENT
結(jié)果分析:
命令中“1p”表示執(zhí)行的動作是在屏幕中輸出文件的第一行,注意“1”不能省略。選項“-n”表示只輸出動作規(guī)定的內(nèi)容,如果缺省,則在輸出第一行后,又把整個文件輸出一次,如:[root@localhosttemp]#sed'1p'cut-studentinfo.txt
執(zhí)行結(jié)果為:IDNAMESEXAGEDEPARTMENTIDNAMESEXAGEDEPARTMENT01LiningM18computer02MaolingW20english03YangminM21math04WanghongM19physicalsed命令支持管道符輸出。9.2字符截取命令179.2.3sed命令
例9.22可用如下命令輸出/etc/passwd文件的第三行內(nèi)容:[root@localhosttemp]#cat/etc/passwd|sed-n'3p'
執(zhí)行結(jié)果為:daemon:x:2:2:daemon:/sbin:/sbin/nologin
例9.23可用如下命令將cut-studentinfo.txt文件輸出時,刪除
第二行和第三行,而不刪除文件本身的相關內(nèi)容:[root@localhosttemp]#sed'2,3d'cut-studentinfo.txt
執(zhí)行結(jié)果為:IDNAMESEXAGEDEPARTMENT03YangminM21math04WanghongM19physical
注意:標題行是第一行。
例9.24cut-studentinfo.txt文件末尾追加一個新行,內(nèi)容為:
“05 Zhangli M 18 tmath”:[root@localhosttemp]#sed'5a05\tZhangli\tM\t18\tmath'cut-studentinfo.txt
執(zhí)行結(jié)果為:……04WanghongM19physical05ZhangliM18math
結(jié)果分析:
上例為在指定行追加新行,如果要在指定行插入新行則用動作參數(shù)“i”,如果要使修改作用于文件,則使用“-i”選項,如:9.2字符截取命令189.2.3sed命令
例9.25將cut-studentinfo.txt文件的第五行(第四條記錄)替換為“Nothisstudent!”:[root@localhosttemp]#sed'5cNothisstudent!'cut-studentinfo.txt
執(zhí)行結(jié)果為:……03YangminM21mathNothisstudent!
例9.26將cut-studentinfo.txt文件中第五行的“Wanghong”替換為“Wangli”:[root@localhosttemp]#sed'5s\Wanghong\Wangli\g'cut-studentinfo.txt
執(zhí)行結(jié)果為:……03YangminM21math04WangliM19physical
注意:該命令將把第五行中所有的“Wanghong”替換為“Wangli”。
例9.27可用如下命令將cut-studentinfo.txt文件中所有的“M”替換為“W”,把所有的“18”替換為“20”:[root@localhosttemp]#sed-e's\M\W\g;s\18\20\g'cut-studentinfo.txt
執(zhí)行結(jié)果為:IDNAWESEXAGEDEPARTWENT01LiningW20computer02WaolingW20english03YangminW21math04WanghongW19physical
結(jié)果分析:命令中使用了“-e”選項,運行sed命令執(zhí)行多個操作,多個操作之間用“;”分割,動作中沒指定行號,表示在全文中執(zhí)行指定的操作。
上述示例中都沒有使用選項“-i”,所以所有的操作沒有作用到文件本身,只是對文件的輸出進行了修改,如果要將修改永久保存到文件,則使用“-i”選項即可。9.3字符處理命令199.3.1排序命令sort命令的功能是將指定文件的內(nèi)容按某種方式排序。
命令格式:[root@localhost~]#sort[選項]文件名
選項說明:-f忽略大小寫。-n指定以數(shù)值型進行排序,缺省使用字符順序排序。-r反向排序。-t指定分隔符,缺省分隔符是tab制表符。-kn[,m]:按指定范圍的字段排序。從第n字段開始,m字段結(jié)束(缺省是行尾)
例9.28可用如下命令對cut-studentinfo.txt文件內(nèi)容按字符順序排序:[root@localhosttemp]#sortcut-studentinfo.txt
例9.29對cut-studentinfo.txt文件內(nèi)容按反向字符順序排序:[root@localhosttemp]#sort–rcut-studentinfo.txt#排序順序正好與例9.27相反
例9.30對/etc/passwd文件按每行的第三個字段排序:[root@localhosttemp]#sort-n-t":"-k3,3/etc/passwd
執(zhí)行結(jié)果為:root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin……結(jié)果分析:命令中的選項“-n”指定按數(shù)字類型的值進行排序,默認升序排序,“-t”選項指定分隔符為“:”,“-k3,3”指定按第三個字段排序。9.3字符處理命令209.3.2條件統(tǒng)計命令wc命令用于統(tǒng)計指定文件中的行數(shù)、單詞數(shù)和字符數(shù)。
命令格式:[root@localhosttemp]#wc[選項]文件名選項說明:-l只統(tǒng)計行數(shù)(line)。-w只統(tǒng)計單詞數(shù)(word)。-m只統(tǒng)計字符數(shù)(mark)。
例9.31可用如下命令統(tǒng)計cut-studentinfo.txt文件中的行數(shù)、單詞數(shù)和字符數(shù):[root@localhosttemp]#wccut-studentinfo.txt
執(zhí)行結(jié)果:525122cut-studentinfo.txt
結(jié)果分析:
表示cut-studentinfo.txt文件,共有5行25個單詞122個字符。如果要只統(tǒng)計文件的行數(shù)、單詞數(shù)或字符數(shù),則使用相應的命令選項則可。9.4條件判斷219.4.1判斷特定類型的文件是否存在
判斷文件是否存在可以用如下兩種命令格式:[root@localhosttemp]#test[選項]文件名或[root@localhosttemp]#[[選項]文件名]
兩種格式功能相同,后者多用于shell腳本編程,其中,最外層的一對方括號是必須的命令符號,且“[”的后面和“]”的前面必須有空格。
選項說明:-b判斷該文件是否為塊(block)設備文件且存在,如果是,結(jié)果為真。-c判斷該文件是否為字符(character)設備文件且存在,如果是,結(jié)果為真。-d判斷該文件是否為目錄(directory)文件且存在,如果是,結(jié)果為真。-e判斷該文件是否存在(exist),如果是,結(jié)果為真。-f判斷該文件是否為普通文件(file)且存在,如果是,結(jié)果為真。-z判斷該文件名是否為空,如果是,結(jié)果為真。-L是否為鏈接(Link)文件且存在,如果是,結(jié)果為真。-p判斷該文件是否為管道(pipine)文件且存,如果是,結(jié)果為真。-s判斷該文件是否存在并且非空,如果是,結(jié)果為真。-S是否存在并且為套接(Socket)字文件,如果是,結(jié)果為真。
例9.32可用如下命令判斷/etc/passwd文件是否存在:[root@localhosttemp]#test-e/etc/passwd或[root@localhosttemp]#[-e/etc/passwd]
例9.33可用如下命令判斷/temp目錄文件是否存在(該目錄的確存在),如果存在輸出“yes”,否則輸出“no”:[root@localhosttemp]#[-d/temp]&&echoyes||echono
執(zhí)行結(jié)果為:yes9.4條件判斷229.4.2判斷文件權(quán)限
判斷文件權(quán)限也可以用如下兩種命令格式:[root@localhosttemp]#test[選項]文件名或[root@localhosttemp]#[[選項]文件名]
該命令只能判斷文件是否有讀、寫或執(zhí)行權(quán)限,而不能精確判定是所有者、所屬組還是其他人有相應權(quán)限,比如:所有者、所屬組或其他人三種用戶中只要有一種用戶對該文件有讀權(quán)限,其結(jié)果就是真。
選項說明:-r判斷指定文件是否存在且有讀權(quán)限,如果是,結(jié)果為真。-w判斷指定文件是否存在且有寫權(quán)限,如果是,結(jié)果為真。-x判斷指定文件是否存在且有執(zhí)行權(quán)限,如果是,結(jié)果為真。-u判斷指定文件是否存在且擁有SUID權(quán)限,如果是,結(jié)果為真。-g判斷指定文件是否存在且擁有SGID權(quán)限,如果是,結(jié)果為真。-k判斷指定文件是否存在且擁有SBit權(quán)限,如果是,結(jié)果為真。
例9.34可用如下命令判斷cut-studentinfo.txt文件是否有讀權(quán)限,如果是輸出“yes”,否則輸出“no”:[root@localhosttemp]#[-rcut-studentinfo.txt]&&echoyes||echono
執(zhí)行結(jié)果為:yes9.4條件判斷239.4.3文件之前進行比較
文件比較可以用如下兩種命令格式:[root@localhosttemp]#test文件名1[選項]文件名2
或[root@localhosttemp]#[文件名1[選項]文件名2]
選項說明:-nt判斷文件1和文件2的修改時間,如果文件1的修改時間更接近于當前時間,則結(jié)果為真;-ot判斷文件1和文件2的修改時間,如果文件1的修改時間更早于當前時間,則結(jié)果為真;-ef判斷文件1和文件2的Inode是否一致,即是否為同一文件,常用于判斷是否為硬鏈接。
例9.35新建cut-studentinfo.txt的硬鏈接文件studentinfo.txt,驗證這兩個文件為同一文件
首先,新建cut-studentinfo.txt文件的硬鏈接文件studentinfo.txt[root@localhosttemp]#lncut-studentinfo.txtzhengze/studentinfo.txt
然后,顯示兩個文件的Inode:[root@localhosttemp]#ls-licut-studentinfo.txt./zhengze/studentinfo.txt
執(zhí)行結(jié)果:261738-rw-r--r--.2rootroot122Apr2904:48cut-studentinfo.txt261738-rw-r--r--.2rootroot122Apr2904:48./zhengze/studentinfo.txt
由于兩個文件的Inode相同,所以是同一文件,驗證如下:[root@localhosttemp]#testcut-studentinfo.txt-ef./zhengze/studentinfo.txt&&echoyes||echono
執(zhí)行結(jié)果為:yes9.4條件判斷249.4.4整數(shù)比較
比較兩個數(shù)的大小可用如下兩種命令格式:[root@localhosttemp]#test整數(shù)1[選項]整數(shù)2或[root@localhosttemp]#[整數(shù)1[選項]整數(shù)2]
選項說明:-eq如果整數(shù)1和整數(shù)2相等(equal),則結(jié)果為真。-ne如果整數(shù)1和整數(shù)2不相等(Notequal),則結(jié)果為真。-gt如果整數(shù)1大于(greaterthan)整數(shù)2,則結(jié)果為真。-lt如果整數(shù)1小于(lessthan)整數(shù)2,則結(jié)果為真。-ge如果整數(shù)1大于等于(Greaterthanorequal)整數(shù)2,則結(jié)果為真。-le如果整數(shù)1小于等于(Lessthanorequal)整數(shù)2,則結(jié)果為真。
例9.36可用如下命令判斷兩個變量的值是否相等:[root@localhosttemp]#var1=2[root@localhosttemp]#var2=6[root@localhosttemp]#[$var1-eq$var2]&&echoyes||echono
執(zhí)行結(jié)果:no9.4條件判斷259.4.5字符串比較
命令格式類似于前述整數(shù)比較。
選項說明:-z單目運算,如果字符串為空,則結(jié)果為真-n單目運算,如果字符串不為空,則結(jié)果為真。==雙目運算,如果兩個字符串相等,則結(jié)果為真。(注意:運算符兩邊要有空格)!=雙目運算,如果兩字符串不相等,則結(jié)果為真。(注意:運算符兩邊要有空格)
例9.37可用如下命令比較兩個字符串是否相等:[root@localhosttemp]#var_c_1="CentOS"#等號的兩邊不能有任何空格[root@localhosttemp]#var_c_2=ubunto#中間無空格的字符串賦值,可以不用引號[root@localhosttemp]#[$var_c_1==$var_c_2]&&echoyes||echono
執(zhí)行結(jié)果為:no解釋說明:
判斷兩個整數(shù)是否相等用“-eq”選項,而判斷兩個字符串是否相等要用“==”選項。9.4條件判斷269.4.6多重條件判斷
命多重條件判斷令格式類似于字符串比較:[root@localhosttemp]#[邏輯表達式1選項
邏輯表達式2]
選項說明:-a雙目運算,如果邏輯表達式1和邏輯表達式2同時成立,則結(jié)果為真。-o雙目運算,邏輯表達式1和邏輯表達式2只要有一個成立,則記過為真。!
單目運算,邏輯非。
例9.38可用如下命令判斷如果var1=3且var2=6,則輸出“yes”:[root@localhosttemp]#var1=3[root@localhosttemp]#var2=6[root@localhosttemp]#[$var1-eq3-a$var2-eq6]&&echoyes||echono
輸出結(jié)果為:yes9.5流程控制279.5.1if選擇語句1.單分支if語句if語句中,如果使用“;”作為分割符時,整個if語句的程序塊可以寫在一行,其語法格式是:if邏輯判斷式;then程序體;fi#fi是if語句的結(jié)束標志
不使用“;”分割時,then和fi都要另起一行,其語法格式是:if邏輯判斷式then程序體fi
其中的邏輯表達式是test判斷語句(按test命令格式書寫),if是語句開始標識符,fi是語句結(jié)束標識符,then表示當邏輯表達式的值為真時,執(zhí)行其后的程序體。
例9.39可用如下命令判斷var1的值是否為3,如果是輸出“ok!”:[root@localhosttemp]#if[$var1-eq3];thenechook;fi
例9.40編寫shell腳本文件“partition_test.sh”,當/dev/sda1分區(qū)使用率達到80%以上后發(fā)布預警。[root@localhosttemp]#vipartition_test.sh#輸入如下內(nèi)容:#!/bin/bash#Author:Yhrate=$(df-h|grep/dev/sda1|awk'{print$5}'|cut-d%-f1)if[$rate-ge80]thenecho"warning:Partitionsda1isfull!"fi
編輯完成后,保存退出,然后執(zhí)行如下命令:[root@localhosttemp]#chmod755./partition_test.sh[root@localhosttemp]#./partition_test.sh
把該腳本與定時任務結(jié)合起來,可以完成定時檢查分區(qū)的任務。Shell編程中,流程控制語句主要包括順序控制、分支控制和循環(huán)控制三類。這里主要介紹后兩類流程控制語句。9.5流程控制289.5.1if選擇語句2.兩分支if語句
類似于單分支if語句,語法格式為:if邏輯判斷式;then程序體;else程序體;fiif、then、else和fi各部分也可以不寫在同一行,這時要去掉“;”。
例9.41編寫shell腳本,完成對cut-studentinfo.txt文件的備份。新建腳本程序:1#!/bin/bash2#Author:Yh3dt=$(date+%y%m%d)#以年月日格式獲取當前時間4size=$(du-sh/temp/cut-studentinfo.txt)#獲取備份文件大小5if[-d/temp/bkp_student]#判斷/temp/bkp_student是否存在6then7echo"directoryisexistent!"8else9echo"Thedirectoryunexisted!"10mkdir/temp/bkp_student11fi12echo"Date:$dt">/temp/bkp_student/bkp_student.txt#把備份時間寫入文件13echo"Size:$size">>/temp/bkp_student/bkp_student.txt#把文件大小寫入文件14cd/temp/bkp_student15#將/temp/cut-studentfinfo.txt和bkp_student.txt兩個文件一起壓縮,壓縮文件名包含日期信息($dt),壓縮產(chǎn)生的所有臨時文件全部丟棄(&>/dev/null)16tar-zcfstudentinfo_backup_$dt.tar.gz/temp/cut-studentinfo.txtbkp_student.txt&>/dev/nullrm-frbkp_stuent.txt#壓縮結(jié)束后,刪除臨時文件可用下面的命令查看壓縮包中的文件:[root@localhostbkp_student]#tar-ztvfstudentinfo_backup_180430.tar.gz9.5流程控制299.5.1if選擇語句3.多分支if語句
多分支if語句的語法格式如下:if邏輯判斷式1;then程序體1;elif邏輯判斷式2;then程序體2;……;else程序體n;fi
當然,在多分支語句中,各部分也可以不寫在同一行,這時要去掉相應的“;”。
例9.42判斷var1的值是否為1,如果是,則輸出“Thevalueofvar1is:1”,否則判斷var1的值是否為2,如果是,則輸出“Thevalueofvar1is:2”,否則輸出“Thevalueofvar1isothes.”。
該問題屬于多分支選擇情況,所以使用if多分支選擇語句,編寫程序如下:[root@localhostbkp_student]#if[$var1-eq1];thenecho"Thevalueofvar1is:1";\elif[$var1-eq2];thenecho"Thevalueofvar1is:2";\elseecho"Thevalueofvar1isothes.";fi
執(zhí)行結(jié)果(略)。9.5流程控制309.5.1if選擇語句3.多分支if語句
例9.43下面的Shell腳本判斷輸入文件是否存在,如果不存在,返回,如果存在進一步判斷文件的類型:#!/bin/bash#Author:Yhread-p"pleaseinputanameoffile:"file#從鍵盤輸入一個文件名賦值給file變量if[-z$file]#判斷文件名是否為空thenecho"Warning:thelengthofthefilecan'tbe0!"exit1#跳出程序并返回數(shù)值:1elif[!-e$file]#判斷文件是否存在thenecho"Error:thefile$fileunexisted!"exit2#跳出程序并返回數(shù)值:2elif[-f$file]thenecho"$fileisanormalfile."elif[-d$file]thenecho"$fileisaderictory."elseecho"$fileisanotherfile."9.5流程控制319.5.2case選擇語句
與if語句的多分支結(jié)構(gòu)類似,case語句也是一種多分支選擇語句,不同的是if語句可以判斷多種不同變量的條件,而case語句只能針對一個變量進行多種情況的判斷,即某一特定變量取不同值的情況。
語法格式:case$變量名in值1)程序體1;;值2)程序體2;;……*)
程序體n;;esaccase的各部分也可以寫在同一行,注意用分號分割(對于case語句,兩種格式都要用雙分號分割):case$變量名in值1)程序體;;值2)程序體;;……;;*)程序體;;esac
例9.44可用如下命令語句判斷var1變量的值,如果var1=1,則打印“*”,如果var1=2,則打印“**”,如果為其它情況時,打印“***”:[root@localhost~]#var1=3[root@localhost~]#case$var1in1)echo"*";;2)echo"**";;*)echo"***";;esac
執(zhí)行結(jié)果:***9.5流程控制329.5.3for循環(huán)語句1.循環(huán)次數(shù)不定的for循環(huán)結(jié)構(gòu)
這種格式適合循環(huán)次數(shù)不定的情況,
語法格式:for變量in值1值2……值ndo
程序體done
該for語句循環(huán)n遍,第一次循環(huán),把值1賦值給變量,第二次循環(huán),把值2賦值給變量,以此類推。如果寫在一行,則相應的語法格式為:for變量in值1值2……值n;do 程序體;done
例9.45寫一個shell腳本whatday.sh,要求輸出星期日——星期六。新建腳本程序:#!/bin/bash#Author:YhforDayinSundayMondayTuesdayWednesdayThursdayFridaySaturdaydoecho"Todayis$Day"done
注意:第三行中“Day”變量名前不能用“$”符號,這里不是引用變量而是給變量賦值。9.5流程控制339.5.3for循環(huán)語句1.循環(huán)次數(shù)不定的for循環(huán)結(jié)構(gòu)
例9.46編寫shell腳本文件unzip_batch.sh,批量解壓/temp目錄下所有以tar.gz為后綴的壓縮文件。
新建unzip_batch.sh腳本程序:#!/bin/bash#Author:Yhcd/templs*.tar.gz>ls.txt#顯示以tar.gz為后綴所有文件,并輸出重定向到ls.txt文件forfilein$(catls.txt)#注意“$”、“()”兩個符號必須要有doecho"Thefilenameis:$file"tar-zxf$file&>/dev/null#逐個解壓文件done2.循環(huán)次數(shù)確定的for循環(huán)結(jié)構(gòu)
這種格式適合循環(huán)次數(shù)確定的情況。
語法格式:for((賦初始值;循環(huán)控制條件;改變控制變量))do
程序體Done
例9.47編寫shell腳本sum.sh,求1+2+3+……+100的值。新建sum.sh腳本程序:#!/bin/bash#Author:Yhsum=0for((i=1;i<101;i=i+1))dosum=$((sum+i))#可以寫為:sum=$(($sum+i))doneec
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度寶鋼集團實習生勞動合同管理規(guī)范3篇
- 品牌聯(lián)營合同(2篇)
- 二零二五年度公共事業(yè)實習生錄用合同2篇
- 2025年浙教版四年級英語下冊階段測試試卷
- 2025年度智能制造產(chǎn)業(yè)債權(quán)轉(zhuǎn)讓與投資合作協(xié)議范本3篇
- 二零二五年度國有企業(yè)資產(chǎn)置換與轉(zhuǎn)讓合同3篇
- 2025年滬科版九年級科學上冊階段測試試卷
- 2025年人教版PEP七年級地理下冊月考試卷含答案
- 二零二五年度定制房地產(chǎn)項目投資合同2篇
- 2025年人教五四新版九年級化學上冊月考試卷
- 2024年工程部年終總結(jié)
- 七年級上冊道德與法治2023-2024期末試題附答案系列
- 內(nèi)科護理學重點總結(jié)
- 2019年海南省公務員考試申論真題(甲類)
- 事業(yè)部制改革方案
- 2025屆廣東省揭陽市高一生物第一學期期末統(tǒng)考模擬試題含解析
- CSR報告與可持續(xù)發(fā)展
- 蘇教版五年級上冊小數(shù)混合運算300道及答案
- 第一章問題解決策略:分類討論 教案 2024-2025學年 魯教版(五四制)六年級數(shù)學上冊
- 期末復習知識點-2024-2025學年統(tǒng)編版道德與法治九年級上冊
- 2024年小學語文名師工作室年度工作總結(jié)
評論
0/150
提交評論