版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7講Shell程序設(shè)計(jì)Shell的含義Shell既是一種命令語言,又是一種程序設(shè)計(jì)語言作為命令語言,它交互式地解釋和執(zhí)行用戶輸入的命令作為程序設(shè)計(jì)語言,它定義了各種變量和參數(shù),并提供了在高級(jí)語言中才有的控制結(jié)構(gòu),如循環(huán)和分支。目前流行的Shellash:Linux中占用資源最少的一個(gè)小Shell,它只包含24個(gè)內(nèi)部命令bash:Linux系統(tǒng)默認(rèn)的Shell,包含40個(gè)內(nèi)部命令,基于GNU架構(gòu)發(fā)展而來。ksh:與商業(yè)發(fā)行版的ksh兼容,包含42個(gè)內(nèi)部命令,由AT&TBelllab.發(fā)展而來,兼容于bashcsh:是Linux比較大的內(nèi)核,共包含52個(gè)內(nèi)部命令,BillJoy設(shè)計(jì)依附亍BSD版zsh:是Linux最大的Shell之一,共包含84個(gè)內(nèi)部命令,若沒有特殊用途,沒有必要安裝。Bash的功能命令記憶能力,可多達(dá)上千個(gè),上次登錄執(zhí)行過的命令記在~/.bash_history,本次在內(nèi)存命令補(bǔ)全功能,按[Tab]鍵shellscripts通配符:*,?Shell基本語法輸入輸出重定向“>”
輸出重定向到一個(gè)文件“>>”
輸出追加到一個(gè)文件“<”
輸入重定向管道“|”前臺(tái)與后臺(tái)前臺(tái):command后臺(tái):command&Shell常用命令bash命令解釋程序包含了一些內(nèi)部命令。內(nèi)部命令在目錄列表時(shí)是看不見的,它們由shell本身提供。1.echo命令格式:echoarg功能:在屏幕上打印出由arg指定的字符串。2.eval命令格式:evalargs功能:當(dāng)shell程序執(zhí)行到eval語句時(shí),shell讀入?yún)?shù)args,并將它們組合成一個(gè)新的命令,然后執(zhí)行。Shell常用命令3.exec命令格式:exec命令命令參數(shù)功能:當(dāng)shell執(zhí)行到exec語句時(shí),不去創(chuàng)建新的子進(jìn)程,而是轉(zhuǎn)去執(zhí)行指定的命令,當(dāng)指定的命令執(zhí)行完時(shí),該進(jìn)程,也就是最初的shell就終止了,所以shell程序中exec后面的語句將不再被執(zhí)行。4.export命令格式:export變量名或:export變量名=變量值功能:shell可以用export把它的變量向下帶入子shell從而讓子進(jìn)程繼承父進(jìn)程中的環(huán)境變量。但子shell不能用export把它的變量向上帶入父shell。注意:不帶任何變量名的export語句將顯示出當(dāng)前所有的export變量。Shell常用命令5.readonly命令格式:readonly變量名功能:將一個(gè)用戶定義的shell變量標(biāo)識(shí)為不可變的。不帶任何參數(shù)的readonly命令將顯示出所有只讀的shell變量。6.read命令格式:read變量名表功能:從標(biāo)準(zhǔn)輸入設(shè)備讀入一行,分解成若干字,賦值給shell程序內(nèi)部定義的變量。7.shift語句功能:shift語句按如下方式重新命名所有的位置參數(shù)變量:$2成為$1,$3成為$2……在程序中每使用一次shift語句,都使所有的位置參數(shù)依次向左移動(dòng)一個(gè)位置,并使位置參數(shù)“$#”減一,直到減到0。Shell常用命令8.wait功能:是shell等待在后臺(tái)啟動(dòng)的所有子進(jìn)程結(jié)束。Wait的返回值總是真。9.exit功能:退出shell程序。在exit之后可有選擇地指定一個(gè)數(shù)字作為返回狀態(tài)。10.“.”(點(diǎn))命令格式:.Shell程序文件名功能:使shell讀入指定的shell程序文件并依次執(zhí)行文件中的所有語句。創(chuàng)建和執(zhí)行shell程序1.創(chuàng)建一個(gè)別名文件:(bash)示范文件myenv,內(nèi)容如下:
#!/bin/bashclear cal echohello!!!2.在Linux下可以用以下方法來執(zhí)行mynev. chmod命令:#chmod+xmynev3.執(zhí)行shell程序
命令行上:#./mynev說明:以#開始行表示注釋變量
3種類型:環(huán)境變量:系統(tǒng)提供,不用定義,可以修改內(nèi)部變量:系統(tǒng)提供,不用定義,不能修改用戶變量:定義,可以修改與其他語言的區(qū)別:非類型性質(zhì),也就是不必指定變量是數(shù)字或字符串等。用戶變量舉例例1:字符串變量賦值shell程序my1:
var=”string”newvar=”Valueofvaris$var”echo$newvar執(zhí)行shell程序my1,可得到如下的結(jié)果:
Valueofvarisstring例2:數(shù)值變量賦值shell程序mynu:
x=15 echo$x得到如下的結(jié)果:
15
變量賦值給變量賦值locunt=0訪問變量值lcount=$var例如要把var的值賦給變量lcountlcount=$var進(jìn)行數(shù)值運(yùn)算:(把var的值加5賦給lcount)lcount=$(($var+5))或letlcount=$var+5或lcount=`expr$var+5`環(huán)境變量(注意:變量名大寫)echo$PATH指令ls完整文件名為:/bin/ls(這是絕對(duì)路徑),為什么我在任何目錄下輸入ls都可以顯示呢?這是因?yàn)榄h(huán)境變量PATH中的定義!例如[root@www~]#echo$PATH/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
記錄所有搜索路徑環(huán)境變量還有HOME、MAIL、SHELL
常見的環(huán)境變量PATH:決定了shell將到哪些目錄中尋找命令或程序。HOME:當(dāng)前用戶主目錄。UID:用戶ID。MAIL:當(dāng)前用戶的郵件存放目錄。SHELL:當(dāng)前用戶用的是哪種Shell。HISTSIZE:保存歷史命令記錄的條數(shù)LOGNAME:當(dāng)前用戶的登錄名。HOSTNAME:主機(jī)的名稱。內(nèi)部變量部分內(nèi)部變量及其作用變量作用
$#傳給shell程序的位置參數(shù)的數(shù)目
$?最后命令的完成碼或在shell程序內(nèi)所執(zhí)行的shell程序
$0shell程序的名稱
$*調(diào)用shell程序所傳送的全部變?cè)膯巫址?/p>
my2的示范例子:echo“Numberofparametersis”$#echo“Shellreturncodeis”$?echo“Programnameis”$0echo“Parametersasasinglestringis”$*在bash中,如果從命令行中執(zhí)行my2如下:#./my2wangzhang將得到如下的結(jié)果:Numberofparametersis2Programnameismy2
Parametersasasinglestringiswangzhang特殊字符雙引號(hào)在字符串含有嵌入的空格時(shí),用雙引號(hào)括起來。這是一個(gè)有關(guān)bash的例子:
var=”teststring”newvar=”Valueofvaris$var”echo$newvar執(zhí)行上面的三行shell程序,可得到如下的結(jié)果:./my1
Valueofvaristeststring單引號(hào)利用單引號(hào)把字符括起來,以阻止shell解析變量。把前面的雙引號(hào)改為單引號(hào),執(zhí)行程序可得到如下的結(jié)果:./my11
Valueofvaris$var特殊字符
字符說明
$指出shell變量名的開始
|把標(biāo)準(zhǔn)輸出通過管道傳送到下個(gè)命令
#標(biāo)記注釋開始
&在后臺(tái)執(zhí)行進(jìn)程>輸出重定向操作符
<輸入重定向操作符
>>輸出重定向操作符{添加到文件}<<跟在輸入結(jié)束自符串后(HERE)操作符.filmname執(zhí)行(“源”)filename文件空格在兩個(gè)字之間的間隔符通配符字符說明?匹配一個(gè)字符*匹配一個(gè)或幾個(gè)字符
[]列出字符的范圍,例如[abcd]
[a-z]意指a到z的全部字符
[a,z]意指a或z字符特殊字符反斜杠
在某個(gè)字符前利用反斜杠可以阻止shell把后面的字符解釋為特殊字符。例如,把$test的值賦給變量var。輸入如下命令:
var=$test如下命令才把$test存放在var中:
var=\$test
見例子./my111反引號(hào):通知shell執(zhí)行由反引號(hào)定義的字符串。
wc當(dāng)需要把執(zhí)行命令的結(jié)果存放在變量中時(shí),就可以在shell程序中利用反引號(hào)。例如,要統(tǒng)計(jì)當(dāng)前目錄下一個(gè)文件中test.txt有幾行并把結(jié)果存在叫做var的變量中:
var=`wc-ltest.txt`pdksh和bash環(huán)境見例子./my1111分支語句ifif語句
if語句通過判斷邏輯表達(dá)式來作出選擇,在pdksh和bash中的條件語句有如下的格式:if[expression];thenstatementselif[expression];thenstatementselsestatementsfiif條件是可以嵌套的,
位置參數(shù)及if語句
下述是一個(gè)shell程序的my3,只帶了一個(gè)參數(shù)(名字),并在屏幕上顯示這個(gè)名字:
#Namedisplayprogramif[$#-eq0];thenecho“Namenotprovided”elseecho”Yournameis”$1 fi
在bash中,如果執(zhí)行mypgm1如下:
#./my3
將得到輸出:
Namenotprovided
但是,如果執(zhí)行mypgm1如下:
#./my3wang
則得到如下的輸出:
Yournameiswang
位置參數(shù)
如果把程序my4修改為:
#Namedisplayprogramif[$#-eq0];thenecho“Namenotprovided”elseecho”Yournameis$2” fi
在bash中,如果執(zhí)行mypgm1如下:
#./my4
將得到輸出:
Namenotprovided
但是,如果執(zhí)行mypgm1如下:
#./my4wangzhang
則得到如下的輸出:
Yournameiszhang
mypgm1還說明了shell編程的另一個(gè)方面,即內(nèi)部變量。在mypgm1中的變量$#是內(nèi)部變量,并提供傳給shell程序的位置參數(shù)的數(shù)目。設(shè)計(jì)一個(gè)Shell程序,讀入一個(gè)正整數(shù),如果是奇數(shù)顯示“odd”,如果是偶數(shù)顯示“even”。readxlety=$x/2*2if[$y–eq$x];thenecho“even”elseecho“odd”fi見例子./if測(cè)試文件f1是否存在,若存在刪除它,不存在建立文件f1
測(cè)試目錄/root/u1是否存在,若存在刪除它,不存在建立它Shell程序設(shè)計(jì)流程控制bash表達(dá)式的比較1.字符串比較
=比較兩個(gè)字符串是否相等
!=比較兩個(gè)字符串是否不相等
-n判斷字符長(zhǎng)度是否大于零
-z判斷字符長(zhǎng)度是否等于零bash表達(dá)式的比較2.?dāng)?shù)字比較
-eq比較兩個(gè)數(shù)是否相等
-ge比較一個(gè)數(shù)是否大于或是等于另一個(gè)數(shù)
-le比較一個(gè)數(shù)是否小于或是等于另一個(gè)數(shù)
-ne比較兩個(gè)數(shù)是否不等
-gt比較一個(gè)數(shù)是否大于另一個(gè)數(shù)
-lt比較一個(gè)數(shù)是否小于另一個(gè)數(shù)bash表達(dá)式的比較3.文件操作符
-d確定文件是否為目錄
-f確定文件是否為普通文件
-r確定是否對(duì)文件設(shè)置了讀許可。
-s確定文件名是否具有大于零的長(zhǎng)度
-w確定文件是否設(shè)置了寫許可
-x確定文件是否設(shè)置了執(zhí)行許可bash表達(dá)式的比較4.邏輯操作符
邏輯操作符用來根據(jù)邏輯規(guī)則比較表達(dá)式。!,-a,-o字符表示NOT、AND和OR!求反(”非”)邏輯表達(dá)式
-a邏輯AND(”與”)兩個(gè)邏輯表達(dá)式
-o邏輯OR(”或”)兩個(gè)邏輯表達(dá)式循環(huán)語句for語句第一種格式如下:
forcurvarinlistdostatementsdone
對(duì)list中的每個(gè)值需要執(zhí)行一次statements時(shí)應(yīng)利用這種格式。對(duì)每次循環(huán),把list中的當(dāng)前值賦給變量curvar,list可以使含有幾個(gè)項(xiàng)的變量,或是用空格分隔的值表。For語句的這種格式是由pdksh和bash使用的。循環(huán)語句1.for語句假設(shè)需要把目錄中的每個(gè)文件在一個(gè)叫做backup的子目錄中建立備份,可以在bash
中執(zhí)行如下的程序:
mkdirbackup forfilein*.txtdocp$filebackup/$filedone
執(zhí)行后把當(dāng)前目錄下的.c為后綴的文件拷貝到子目錄backup下見例子./my5求前5個(gè)自然數(shù)之和見例子./my6循環(huán)語句while語句格式如下:
whileexpression
dostatementsdone
循環(huán)語句前
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年付里葉紅外分光光度計(jì)合作協(xié)議書
- 2025年家政保潔合作協(xié)議書
- 電影發(fā)行協(xié)議范本
- 城市特困居民健康管理協(xié)議書
- 家政公司實(shí)習(xí)生聘用協(xié)議書
- 能源設(shè)備租賃服務(wù)合同
- 環(huán)保行業(yè)智能垃圾處理與資源化利用方案
- 教育行業(yè)在線教育平臺(tái)建設(shè)與教學(xué)方法創(chuàng)新方案
- 企業(yè)信息化建設(shè)合作項(xiàng)目書
- 智能垃圾分類系統(tǒng)開發(fā)合同
- 醫(yī)院服務(wù)意識(shí)培訓(xùn)課件
- 安全生產(chǎn)事故責(zé)任倒查制度范本
- 基金行業(yè)薪酬報(bào)告調(diào)查報(bào)告
- GB/T 18329.2-2023滑動(dòng)軸承多層金屬滑動(dòng)軸承第2部分:合金厚度≥2 mm的結(jié)合強(qiáng)度破壞性試驗(yàn)
- 《中國(guó)健康生活方式預(yù)防心血管代謝疾病指南》
- 如何正確看待成績(jī)主題班會(huì)課件
- (滬教牛津版)深圳市小學(xué)1-6年級(jí)英語單詞默寫表(英文+中文+默寫)
- 樂山英文介紹
- 工程量清單清單計(jì)價(jià)封面
- 壓濾機(jī)產(chǎn)品質(zhì)量檢測(cè)報(bào)告
- 267條表情猜成語【動(dòng)畫版】
評(píng)論
0/150
提交評(píng)論