



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、Shell 程序設(shè)計(jì)學(xué)習(xí)內(nèi)容 :1. 什么是 shell2. 語法:變量、條件判斷、程序控制3. 函數(shù)4. 命令和命令的執(zhí)行5. Here 文檔6. 調(diào)試7. Grep 命令和正則表達(dá)式8. Find 命令一、什么是 shell?Shell 是一個(gè)作為用戶與Linux 系統(tǒng)間接口的程序,它允許用戶向操作系統(tǒng)輸入需要執(zhí)行的命令。在一個(gè)linux 系統(tǒng)中可以安裝多個(gè)shell,這些 shell 和其他程序一起環(huán)繞在 linux 內(nèi)核四周。默認(rèn)安裝的標(biāo)準(zhǔn)是 /bin/sh ,它是 GNU 工具集中的 bash。使用 /bin/bash version 可以查看版本。精選文庫Shell 歷史版本 :
2、shcsh,、 tcsh、 zshksh、 pdkshbash二、shell 腳本編寫、運(yùn)行、調(diào)試1. 腳本均以 #!/bin/bash 開頭。2. 腳本中的 #為注釋符。3. 使用 exit 為腳本設(shè)置返回一個(gè)退出碼, 注意 0 表示的是執(zhí)行成功。示例:#!/bin/bash# this is my first shell! echo “helloword! ”exit 04. 設(shè)置腳本為可執(zhí)行 : chmod u+x filename.sh5. 執(zhí)行: ./filename.sh6. sh x ./filename.sh三、shell 語法1、變量:無需事先聲明, 直接使用, 在訪問時(shí)要加
3、 $在變量前。例如:Str=helloecho$Stra.這兩行語句將在屏幕輸出一個(gè)“hello”,shell 區(qū)別大小寫,定義變量時(shí)應(yīng)該注意。b.如果為變量所賦的字符串中含有空格, table 或換行符應(yīng)使用“”標(biāo)示,例如“helloword! ”-2精選文庫c.變量在引號(hào)中依然有效如echo “thisis$Str!”依然會(huì)輸出: thisishello!練習(xí)示例: (注:后續(xù)的示例中只有關(guān)鍵部分,練習(xí)時(shí)補(bǔ)全)echo “inputpassword:”read pasdecho “the password is $pasd”d.如果需要輸出字符 $Str 可以用單引號(hào)和來處理:$Str和
4、$Str 輸出的都是$Str 不是變量表示的值,shell中的變量一般都是字符串形式。e: 環(huán)境變量,介紹幾種:$HOME當(dāng)前用戶的家目錄$PATH搜索命令的目錄列表$0shell 腳本的名字$#傳遞給腳本的參數(shù)個(gè)數(shù)$腳本的進(jìn)程號(hào)f:參數(shù)變量:$1,$2 腳本的程序參數(shù)$*列出所有參數(shù)$S*的一種變體,它參數(shù)不會(huì)擠在一塊。g:變量做整形數(shù)字使用:a=123let “a +=1”-3精選文庫echo “a = $a”2、條件1) 使用 test 或 如 if test f file.cthen .fi以上代碼也可寫成如下形式(盡量使用這種形式 )if -f file.c (注意 :if 語句和
5、之間有個(gè)空格 then.fi完整示例:#!/bin/bashecho“isitmorning? Pleaseansweryesorno”readtimeofdayif $timeofday = “yes” ;thenecho“good morning”elseecho“good afternoon”fiexit 02)elif 語句,在 if,else 語句中增加分支判斷。-4精選文庫如下示例:#!/bin/bashecho“isitmorning? Please answeryesorno”readtimeofdayif $timeofday = “yes” ;thenecho“good m
6、orning”elif $timeofday = “no”thenecho “Good afternoon”elseecho “sorry ,$timeofday not recognized. Enter yes or no” exit 1fiexit 03、一個(gè)與變量有關(guān)的問題。如上程序,如果沒有輸入Yes和 no 直接按回車鍵,會(huì)出現(xiàn)什么結(jié)果呢?程序會(huì)有出錯(cuò)信息。原因是。 。避免該問題產(chǎn)生的方法對(duì)變量使用雙引號(hào)“ $Str”4、for 語句使用 for 語句可以循環(huán)處理一組值, 這組值可以是任意字符串的集合。 它的語法形式如下:forvariableinvalues-5精選文庫dosom
7、ethingdone示例:#!/bin/bashFor foo in hello myname 129doecho $foodoneexit 0使用通配符擴(kuò)展for 循環(huán)#!/bin/shfor file in $(ls*.sh);doecho $filedoneexit 05、while 語句語法結(jié)構(gòu):whilecondition doDosometingdone示例:一個(gè)簡陋的密碼檢查程序-6精選文庫#!/bin/bashecho“Enter password”readpawordwhile “$paword” != “secret”doecho “sorry, try again ”re
8、ad paworddoneexit 0字符串比較 :string = stringstring != string-n string-z string算數(shù)比較num1 eqnum2num1 nenum26、until 語句 ,與 while 循環(huán)類似,只是把測試條件反過來了。語法形式如下:until conditiondo-7精選文庫Dosomethingdone7、case語句語法結(jié)構(gòu) :casevariable inpattern1 | pattern)dosomething;pattern2 | pattern)dosomething;esac該語句執(zhí)行 vairable 與第一個(gè) pa
9、ttern 匹配上的語句。例如:#!/bin/bashecho “is it morning? Please answer yes or no”readtimeofdaycase “$timeofday”inyes ) echo “good moring”;no ) echo “good afternoon”;y) echo “good morning”;n) echo “good afternoon”;*)echo “sorry,answer not recognized”;esacexit 0匹配部分語句也可改寫為:-8精選文庫case“$timeofday ” inyes | y | Y
10、es | YES ) echo“good morning”;n* | N* )echo “good afternoon”;*)echo “sorry, answer not recognized”;esac也可以將匹配行改為 ; yY|YyEeSs8、命令列表有時(shí)需要將好幾條命令連接成一個(gè)序列。如下if -f this_file ; thenif -f that_file ; thenif -f the_other_file ; thenecho “allfiles present, and correct”fififi9、AND 列表只有在前一條命令執(zhí)行成功返回true 才執(zhí)行下一條。語法結(jié)
11、構(gòu):Statement1&&Statement1&&Statement1&&示例 :#!/bin/bashtouch file_one-9精選文庫rm f file_twoif -f file_one && echo “hello”&& -f file_two && echo “there” thenecho “in if ”elseecho “in else”fiexit 010、OR 列表 ,直到有一條命令執(zhí)行成功為止。語法結(jié)構(gòu):Statement1 |Statement2 | Statemen
12、t3 |示例:if -f file_one | echo “hello”| echo “there ” thenecho “in if ”elseecho “in else”fi11、語句塊如果想在只允許使用單個(gè)語句的地方(如 AND,OR)使用多條語句,可以是花括號(hào) 來構(gòu)造一個(gè)塊。如下:Get_confirm && -10精選文庫echo “hello”cat $tmp_file > $tracks_fileadd_record_tracks12、函數(shù)要定義一個(gè)shell 函數(shù),只需寫出它的名字,加上括弧,再把函數(shù)要實(shí)現(xiàn)的語句放在一對(duì)花括號(hào)中,如下所示:function
13、_name () Statements示例:#!/bin/bashfoo()echo“function foo is executing”echo“this is foo”fooecho “foo end!”exit 0如果在函數(shù)中沒有return 命令指定一個(gè)返回值, 則函數(shù)返回的就是執(zhí)行的最后一條命令的退出碼。示例-11精選文庫#!/bin/bash# 函數(shù)部分Yes_or_no()Echo “is your name $* ?”while truedoecho n “Enter yes or no: ”read xcase “$x”iny | yes ) return 0;n | no
14、) return 1;*) echo “please input yes or no”esacdone#主程序部分echo“original parameters are $*”ifyes_or_no “$1”thenecho “HI$1,nice name”elseecho “never mind”fi-12精選文庫exit 0在函數(shù)內(nèi)部定義的變量,在函數(shù)運(yùn)行后,變量依然有效,如果只想在本函數(shù)內(nèi)使用臨時(shí)變量,可在變量前加上local#!/bin/bashfoo()localstr=aaaa#如果此處無 local 則 最后的語句是可以輸出aaaa的echo "in foo $str
15、"fooecho "over $str"$# 表示參數(shù)個(gè)數(shù), $1 為第一個(gè)參數(shù)依次類推。 ($*,$)腳本中無函數(shù)的聲明,調(diào)用某個(gè)函數(shù)前,該函數(shù)需要先被定義,所以函數(shù)的定義可以寫在腳本的開始。13、一些命令1)break 命令在控制條件為滿足之前,可以跳出for ,while,until 循環(huán),后面可帶參數(shù)值,來表明要跳出的循環(huán)層數(shù),但我們不建議這么做。2) :命令冒號(hào)(:)命令是一個(gè)空命令。 偶爾被運(yùn)用簡化邏輯, 相當(dāng)于 true 。-13精選文庫3)continue 命令類似 C 語言中的同名語句??墒筬or,while ,until 循環(huán)跳到下一次循環(huán)繼續(xù)
16、執(zhí)行,循環(huán)變量取循環(huán)列表中的下一個(gè)。如 for x in 1 2 3 doecho before $x continue 1 echo after $xdone4).命令默認(rèn)情況下, shell 腳本程序會(huì)在一個(gè)新創(chuàng)建的環(huán)境中執(zhí)行,所以當(dāng)腳本對(duì)環(huán)境變量所做的任何修改都會(huì)丟失,而點(diǎn) (.)命令允許執(zhí)行的腳本程序改變當(dāng)前的環(huán)境。5)echo 命令輸出一行字符內(nèi)容并換行,若要使其不換行l(wèi)inux 有兩種解決方法: echo n “string to output ”echo e “string to outputc ”(注: -e 是確保啟用了反斜杠轉(zhuǎn)義字符,c 代表去掉換行符,t 代表制表符, n
17、 代表回車 )6)eval 命令eval 允許對(duì)參數(shù)進(jìn)行求值,如下:foo=10-14精選文庫x=fooy=$xecho $y#輸出為 foo當(dāng)使用eval 命令時(shí),如下foo=10x=fooevaly=$xecho $y#輸出為107)exec 命令將當(dāng)前 shell 替換為一個(gè)不同的程序如: exec wall “Thanks for the fish”腳本中的這個(gè)命令會(huì)用wall 命令替換當(dāng)前的shell。第二種用法是修改當(dāng)前文件描述符:exec 3< afile修改文件描述符。8)exit n 命令一般使腳本程序以退出碼n 結(jié)束運(yùn)行。0 表示成功, 1125 是腳本可以使用的錯(cuò)誤
18、代碼。126 表示文件不可執(zhí)行, 127 表示命令未找到128 及以上出現(xiàn)一個(gè)信號(hào)9)export 命令-15精選文庫export 命令可以將變量參數(shù)導(dǎo)出到子shell 中,子 shell 中即可訪問該變量。如TESTA=testa;export TESTA10) expr 命令expr 命令將它的參數(shù)當(dāng)做一個(gè)表達(dá)式來求值。11) printf 命令printf “formatstring ”parameter1 parameter212)return 命令return 命令作用是使函數(shù)返回,后面可帶返回值,如果沒有返回值則默認(rèn)返回最后一條命令的退出碼。13)set 命令示例:從系統(tǒng)提供的參數(shù)
19、date 中提取出月份。#!/bin/bashecho the date is $(date)set $(date)echo The month is $2exit 014)shift 命令shift 命令把所有參數(shù)變量左移一個(gè)位置,使$2 變成 $1,$3 變成$2,$1 被丟棄, $0 保持不變。while “$1”!= “”;doecho “$1”shift-16精選文庫doneexit 015)trap 命令Trap 命令用于指定在接收信號(hào)后將要采取的行動(dòng)。語法結(jié)構(gòu): trap command signal第一個(gè)參數(shù)是收到指定信號(hào)要采取的行動(dòng)。第二個(gè)參數(shù)是要處理的信號(hào)名稱。如果要忽略一
20、個(gè)信號(hào),則將第一個(gè)參數(shù)設(shè)為空字符串。#!/bin/bashtrap 'rm -f /home/sufeng/my_shell/my_tmp_file_$' INT echo creating file /home/sufeng/my_shell/my_tmp_file_$ date > /home/sufeng/my_shell/my_tmp_file_$echo "press interrupt (ctrl-c) to interrupt ."while -f /home/sufeng/my_shell/my_tmp_file_$ ;do echo
21、File existssleep 1doneecho the file no longer existstrap INT-17精選文庫echo creating file /home/sufeng/my_shell/my_tmp_file_$ date > /home/sufeng/my_shell/my_tmp_file_$echo "press interrupt (control-c) to interrupt ."while -f /home/sufeng/my_shell/my_tmp_file_$ ;do echo File existssleep 1do
22、neecho we never get here16)unset 命令unset 命令的作用是從環(huán)境中刪除變量或函數(shù)。但不能刪除shell本身定義的只讀變量。#!/bin/bashfoo="hello world"echo $foounset fooecho $foo17)find 命令find 語法結(jié)構(gòu):findpathoptionstestsactionspath 是要搜索的路徑。Options 選項(xiàng) :-18精選文庫-depth在查看目錄本身之前先搜素目錄的內(nèi)容-follow跟隨符號(hào)鏈接-maxdepths N最多搜索 N 層目錄-mount( 或-xdev)不搜索其
23、他文件系統(tǒng)中的目錄Tests選項(xiàng):-atime N文件在 N 天之前被訪問過-mtime N文件在 N 天之前被修改過-name“pattern”按文件名稱匹配-newer otherfile 文件比 otherfile 要新-typec 文件類型為 c-user username文件的擁有者是指定用戶。對(duì) tests 部分的組合 :!(-not)測試取反-a(-and)兩個(gè)測試都必須為真-o(-or)兩個(gè)測試必須有一個(gè)為真動(dòng)作:-execcommand執(zhí)行一條命令-okcommand同上,只是處理時(shí)回頭提示-print打印文件名-ls對(duì)當(dāng)前文件使用命令ls-dils一個(gè) find 的示例:-
24、19精選文庫sufenglinux-ecmc:/my_shell> find ( -name "*1.sh" -o -atime 2 ) -type f -exec ls -l ;結(jié)果如下:-rwxrwxrwx 1 sufeng users 91 Sep 5 18:54 ./bb1.sh-rwxr-r- 1 sufeng users 258 Sep 4 20:41 ./t_fun1.sh-rwxr-r- 1 sufeng users 174 Sep 4 18:11 ./tm_case1.sh-rwxrwxrwx 1 sufeng users 39 Sep 5 18:3
25、5 ./cc1.sh-rwxrwxrwx 1 sufeng users 167 Sep 1 11:43 ./tm1.sh18)grep 命令grep 語法如下 :grepoptionsPATTERN FILES選項(xiàng)含義-c輸出匹配行的數(shù)目,而不是輸出匹配行-i忽略大小寫-v對(duì)匹配模式取反-l只列出匹配行的文件名-E啟用擴(kuò)展表達(dá)式-h取消輸出行普通前綴。示例:grep -c -v in bb.sh cc.shgrep -c in bb.sh cc.sh-20精選文庫19)正則表達(dá)式字符含義指向一行的開頭$指向一行的結(jié)尾.任意單個(gè)字符方括號(hào)包含一個(gè)字符范圍,其中任何一個(gè)字符都可以匹配,如 ae,在
26、字符范圍前面加 ,即不在指定范圍內(nèi)。匹配模式含義:alnum:字母與數(shù)字字符:alpha:字母:ascii:ASCII 字符:blank:空格或制表符:cntrl:ASCII控制字符:digit:數(shù)字:graph:非控制、非空格字符:lower:小寫字母:print:可打印字符:punct:標(biāo)點(diǎn)符號(hào)字符:space:空白字符,包括垂直制表符:upper:大寫字母:xdigit:十六進(jìn)制數(shù)字-21精選文庫選項(xiàng)含義?匹配是可選的,但最多匹配一次*必須匹配 0 次或多次+必須匹配 1 次或多次n必須匹配 n 次n,必須匹配 n 次或 n 次以上n,m必須匹配 n 到 m 之間,包括 n 和 m以上使用的時(shí)候需要加.示例:grepe$bb.sh以 e 結(jié)尾grepa:blank: bb.sh以 a 結(jié)尾grepTh.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勘察設(shè)計(jì)合同住建部
- 2025年咸寧貨運(yùn)從業(yè)資格證考試模擬考試題庫
- 2025年西雙版納貨運(yùn)運(yùn)輸駕駛員從業(yè)資格證考試試題
- 電商總監(jiān)勞務(wù)合同5篇
- 2023年高考真題全國乙卷地理試卷解析
- 微晶玻璃管戰(zhàn)略市場規(guī)劃報(bào)告
- 加班裝貨送貨合同范本
- 鹵肉店培訓(xùn)合同范本
- 廚房技術(shù)購買合同范本
- 1+X無人機(jī)模擬題與答案
- 航天集團(tuán)人才隊(duì)伍建設(shè)經(jīng)驗(yàn)介紹
- 牙周炎-侵襲性牙周炎
- 心理委員工作記錄表
- 新教科版五下科學(xué)1-5《當(dāng)環(huán)境改變了》公開課課件
- 教師的十大轉(zhuǎn)變課件
- 焦化廠生產(chǎn)工序及工藝流程圖
- 可下載打印的公司章程
- 中藥熏洗法課件
- 本特利探頭應(yīng)用
- QMR-110-00員工手部、接觸面等微生物檢驗(yàn)記錄記錄
- 外陰及陰道炎癥
評(píng)論
0/150
提交評(píng)論