Shell學習總結
時(shi)間(jian):2016-12-30作者(zhe):華(hua)清遠見
一、 shell中(zhong)系統變(bian)量(liang)(liang)、用戶變(bian)量(liang)(liang)和環境變(bian)量(liang)(liang)之間的區別(bie)和使用: Shell有(you)以下(xia)幾種(zhong)基(ji)本類(lei)型的(de)變(bian)量(liang): 1) shell定義的環境變量 shell在開始執行時就已經定義了一些和(he)系統的工作環(huan)境(jing)有(you)(you)關的變(bian)量(liang),這些變(bian)量(liang)用(yong)戶還(huan)可(ke)以重新定義,常(chang)用(yong)的shell環(huan)境(jing)變(bian)量(liang)有(you)(you):
HOME:用于保存注冊目錄的完全路徑名。 2) 用戶定義的變量 用戶(hu)可(ke)以按照下(xia)面的語法規則定義自己的變量: 變量名=變量值 要(yao)注意的一點是(shi),在定義變(bian)量(liang)時(shi),變(bian)量(liang)名前(qian)不應(ying)加(jia)符號(hao)“$”,在引用(yong)變(bian)量(liang)的內容時(shi)則應(ying)在變(bian)量(liang)名前(qian)加(jia)“$”;在給變(bian)量(liang)賦值時(shi),等號(hao)兩邊一定不能留空(kong)格(ge),若(ruo)變(bian)量(liang)中本身就包含(han)了空(kong)格(ge),則整個字(zi)符串都要(yao)用(yong)雙引號(hao)括起來。 在編寫(xie)shell程(cheng)序時,為了使變量(liang)(liang)名和命令(ling)名相區別,建議所有的變量(liang)(liang)名都(dou)用(yong)大寫(xie)字母來表示。 有(you)時我們想要在(zai)說(shuo)明一(yi)個變(bian)量(liang)并對它(ta)設定為(wei)一(yi)個特定值后就不在(zai)改變(bian)它(ta)的(de)(de)值,這(zhe)可以(yi)用(yong)下面的(de)(de)命令(ling)來(lai)保證(zheng)一(yi)個變(bian)量(liang)的(de)(de)只讀性(xing): readly 變量名 在任何(he)時候(hou),建立的(de)變(bian)(bian)量都只是當(dang)前shell的(de)局部變(bian)(bian)量,所以不能被shell運行(xing)的(de)其(qi)他(ta)命(ming)令或shell程序所利用(yong),export命(ming)令可以將一局部變(bian)(bian)量提(ti)供給shell執(zhi)行(xing)的(de)其(qi)他(ta)命(ming)令使(shi)用(yong),其(qi)格式(shi)為(wei): export 變量名
也可以在給變量賦值的同時使用export命令: 使用(yong)export說明的(de)變(bian)量(liang),在shell以(yi)(yi)后運行(xing)的(de)所有(you)命令或程序(xu)中都可以(yi)(yi)訪(fang)問到(dao)。 3) 位置參數 位置參(can)數(shu)是一種在調用(yong)shell程(cheng)(cheng)序(xu)的(de)命(ming)令(ling)行(xing)中按照各自(zi)的(de)位置決定(ding)的(de)變量,是在程(cheng)(cheng)序(xu)名之后輸入的(de)參(can)數(shu)。位置參(can)數(shu)之間用(yong)空格分(fen)隔(ge),shell取(qu)第一個(ge)(ge)位置參(can)數(shu)替換(huan)(huan)程(cheng)(cheng)序(xu)文件中的(de)$1,第二個(ge)(ge)替換(huan)(huan)$2,依次(ci)類推。$0是一個(ge)(ge)特(te)殊的(de)變量,它的(de)內容是當(dang)前(qian)這個(ge)(ge)shell程(cheng)(cheng)序(xu)的(de)文件名,所以(yi),$0不是一個(ge)(ge)位置參(can)數(shu),在顯示(shi)當(dang)前(qian)所有的(de)位置參(can)數(shu)時是不包括$0的(de)。 4) 預定義變量 預(yu)定(ding)義變量(liang)和環境變量(liang)相類似(si),也是在shell一開(kai)始時就定(ding)義了的變量(liang),所不(bu)同的是,用戶只能(neng)根據shell的定(ding)義來使(shi)用這些變量(liang),而不(bu)能(neng)重定(ding)義它。所有預(yu)定(ding)義變量(liang)都(dou)是由$符和另(ling)一個符號組成的,常用的shell預(yu)定(ding)義變量(liang)有:
$#:位置參數的數量 其(qi)中,“$?”用于檢查上一個(ge)命令(ling)執行(xing)是否正確(在Linux中,命令(ling)退出狀態(tai)為(wei)0表示該(gai)命令(ling)正確執行(xing),任(ren)何非0值表示命令(ling)出錯)。 “$$”變(bian)量(liang)常見的(de)用途是用作臨時文(wen)件的(de)名字以保證(zheng)臨時文(wen)件不會重復(fu)。 5) 參數置換的變量(liang) shell提供了參(can)(can)數(shu)置(zhi)換能(neng)(neng)力以(yi)便用戶(hu)可以(yi)根據(ju)(ju)不同(tong)的(de)條件來給變量賦不同(tong)的(de)值(zhi)。參(can)(can)數(shu)置(zhi)換的(de)變量有四種(zhong),這些變量通常(chang)與某(mou)一個位置(zhi)參(can)(can)數(shu)相聯系,根據(ju)(ju)指定的(de)位置(zhi)參(can)(can)數(shu)是否已經設置(zhi)類決定變量的(de)取值(zhi),它們的(de)語法和功能(neng)(neng)分(fen)別(bie)如下。
a. 變量=${參數-word}:如果設置了參數,則用參數的值置換變量的值,否則用word置換。即這種變量的值等于某一個參數的值,如果該參數沒有設置,則變量就等于word的值。 所有這(zhe)四種形式中的“參(can)數(shu)”既可以是位置(zhi)參(can)數(shu),也可以是另一(yi)個變量,只是用位置(zhi)參(can)數(shu)的情況比(bi)較多。 二(er)、 shell程(cheng)序(xu)設計的流程(cheng)控制 1) test測試(shi)命(ming)令 test命令用于檢查某個條件(jian)是否成立,它可以(yi)進行數值(zhi)、字符和(he)文件(jian)三(san)個方面的(de)測試,其測試符和(he)相應的(de)功能分別(bie)如下: (1)數(shu)值測試(shi):
-eq:等于則為真 (2)字符串測試:
=:等于則為真 (3)文件(jian)測試(shi):
-e文件名:如果文件存在則為真 另(ling)外,Linux還提(ti)供了與(“!”)、或(“-o)、非(“-a”)三個邏輯操作符用于將測試條件(jian)連(lian)接起來(lai),其優先(xian)級為(wei):“!”高,“-a”次之,“-o”低。 同時,bash也能完成簡單(dan)的算(suan)(suan)術運算(suan)(suan),格式如下:
$[expression] 2) if條件語句 shell程(cheng)序中的條件分支是通過(guo)if條件語句來實現(xian)的,其一般格式為:
if條件命令串 3) for循環 for循環對一(yi)個變(bian)量(liang)的(de)可(ke)能的(de)值都(dou)執(zhi)行一(yi)個命令序(xu)列(lie)。賦給變(bian)量(liang)的(de)幾個數(shu)值既可(ke)以(yi)(yi)(yi)在(zai)程序(xu)內以(yi)(yi)(yi)數(shu)值列(lie)表(biao)的(de)形(xing)式(shi)提供,也可(ke)以(yi)(yi)(yi)在(zai)程序(xu)以(yi)(yi)(yi)外以(yi)(yi)(yi)位置參(can)數(shu)的(de)形(xing)式(shi)提供。for循環的(de)一(yi)般格式(shi)為:
for變量名 變(bian)量名可以是(shi)用戶選(xuan)擇(ze)的(de)任何字符串,如(ru)果(guo)變(bian)量名是(shi)var,則在(zai)in之(zhi)后給出的(de)數值(zhi)(zhi)將順序替(ti)換循環命令列表(biao)(biao)中的(de)$var。如(ru)果(guo)省略了in,則變(bian)量var的(de)取(qu)值(zhi)(zhi)將是(shi)位置參數。對變(bian)量的(de)每一個(ge)可能的(de)賦值(zhi)(zhi)都將執(zhi)行do和done之(zhi)間(jian)的(de)命令列表(biao)(biao)。 4) while和until循環 while和(he)until命(ming)令都是用命(ming)令的返回狀態值來控制循(xun)環(huan)的。While循(xun)環(huan)的一(yi)般格式為(wei):
while 只要while的“若干個(ge)命令(ling)行1”中后一個(ge)命令(ling)的返回狀態為真,while循環就繼續(xu)執行do...done之間的“若干個(ge)命令(ling)行2”。 until命令是另一(yi)種循環結(jie)構,它(ta)和while命令相似,其(qi)格式(shi)如下:
until until循(xun)環(huan)和while循(xun)環(huan)的區別在于(yu):while循(xun)環(huan)在條(tiao)件為真(zhen)時繼續執(zhi)行循(xun)環(huan),而until則是在條(tiao)件為假時繼續執(zhi)行循(xun)環(huan)。 Shell還(huan)提(ti)供了(le)true和(he)false兩條命令(ling)用于建立無限循(xun)環結構的(de)需要(yao),它們的(de)返回(hui)狀態分別是總(zong)為0或總(zong)為非0 5) case條(tiao)件(jian)選(xuan)擇(ze) if條件(jian)語句用于在兩(liang)個選(xuan)(xuan)(xuan)(xuan)項中選(xuan)(xuan)(xuan)(xuan)定一項,而case條件(jian)選(xuan)(xuan)(xuan)(xuan)擇為用戶(hu)提供了(le)根據字(zi)符串或(huo)變量的(de)值從多個選(xuan)(xuan)(xuan)(xuan)項中選(xuan)(xuan)(xuan)(xuan)擇一項的(de)方法,其格(ge)式如下:
case string in shell通過計算字符串string的(de)值,將其結(jie)果依次和表(biao)達式exp-1、exp-2等進行比較,直(zhi)到(dao)找到(dao)一(yi)個匹配的(de)表(biao)達式為止,如(ru)果找到(dao)了匹配項則執行它下面的(de)命令直(zhi)到(dao)遇到(dao)一(yi)對分號(;;)為止。 在case表(biao)達(da)式中也可以使用shell的(de)通(tong)配符(“*”、“?”、“[ ]”)。通(tong)常用“*”作為case命令的(de)后表(biao)達(da)式以便使在前面找(zhao)不到(dao)任何相應(ying)的(de)匹配項時(shi)執(zhi)行(xing)“其他命令行(xing)”的(de)命令。 6) 無(wu)條件控制語句break和continue break用于(yu)(yu)立即(ji)終止當前循環的執(zhi)行(xing),而contiune用于(yu)(yu)不執(zhi)行(xing)循環中后(hou)面的語句(ju)而立即(ji)開始下一個(ge)循環的執(zhi)行(xing)。這兩個(ge)語句(ju)只有(you)(you)放在do和done之(zhi)間才有(you)(you)效。 7) 函數定(ding)義(yi) 在(zai)shell中還可(ke)以定義函數(shu)(shu)。函數(shu)(shu)實(shi)際上也是由若干條shell命(ming)令組(zu)成的(de)(de),因此它(ta)與shell程(cheng)序形式(shi)上是相(xiang)似的(de)(de),不同(tong)的(de)(de)是它(ta)不是一(yi)個(ge)單獨的(de)(de)進程(cheng),而是shell程(cheng)序的(de)(de)一(yi)部分。函數(shu)(shu)定義的(de)(de)基本(ben)格式(shi)為:
functionname shell函數可以完(wan)成某(mou)些例行的(de)工(gong)作,而且還(huan)可以有(you)自己的(de)退出(chu)狀態,因此函數也可以作為if、while等(deng)控(kong)制結構的(de)條件。 在(zai)函(han)數(shu)定義時(shi)不用帶(dai)參(can)數(shu)說明,但在(zai)調用函(han)數(shu)時(shi)可(ke)以帶(dai)有參(can)數(shu),此時(shi)shell將把(ba)這些參(can)數(shu)分別(bie)賦予相(xiang)應的(de)位(wei)置參(can)數(shu)$1、$2、...及$*。 8) 命(ming)令(ling)分組 在shell中有兩種命(ming)令(ling)分(fen)組的(de)方(fang)(fang)法:“()”和“{}”,前者當(dang)shell執(zhi)(zhi)行(xing)(xing)(xing)()中的(de)命(ming)令(ling)時將(jiang)再創建一個新的(de)子進程(cheng)(cheng)(cheng),然后這(zhe)個子進程(cheng)(cheng)(cheng)去執(zhi)(zhi)行(xing)(xing)(xing)圓(yuan)括弧(hu)中的(de)命(ming)令(ling)。當(dang)用(yong)戶在執(zhi)(zhi)行(xing)(xing)(xing)某個命(ming)令(ling)時不(bu)(bu)想(xiang)讓(rang)命(ming)令(ling)運行(xing)(xing)(xing)時對(dui)狀(zhuang)態集合(如(ru)位置參數、環境變(bian)(bian)量(liang)、當(dang)前工作目錄等)的(de)改變(bian)(bian)影響(xiang)到下(xia)面語句的(de)執(zhi)(zhi)行(xing)(xing)(xing)時,就(jiu)應該把這(zhe)些命(ming)令(ling)放在圓(yuan)括弧(hu)中,這(zhe)樣(yang)就(jiu)能(neng)保證所(suo)(suo)有的(de)改變(bian)(bian)只對(dui)子進程(cheng)(cheng)(cheng)產生影響(xiang),而父(fu)進程(cheng)(cheng)(cheng)不(bu)(bu)受(shou)任何干擾;{}用(yong)于將(jiang)順序執(zhi)(zhi)行(xing)(xing)(xing)的(de)命(ming)令(ling)的(de)輸(shu)(shu)出結(jie)果(guo)用(yong)于另一個命(ming)令(ling)的(de)輸(shu)(shu)入(管(guan)道(dao)方(fang)(fang)式)。當(dang)我(wo)們要真正使用(yong)圓(yuan)括弧(hu)和花括弧(hu)時(如(ru)計(ji)算表達式的(de)優先級),則需要在其前面加上轉義符(fu)(\)以便讓(rang)shell知道(dao)它們不(bu)(bu)是(shi)用(yong)于命(ming)令(ling)執(zhi)(zhi)行(xing)(xing)(xing)的(de)控制所(suo)(suo)用(yong)。 9) 信號 trap命(ming)令用于在shell程序中捕捉到信號,之后可以有三種(zhong)反應方式:
(1)執行一段程序來處理這一信號 trap對上面三種方式提供了三種基本形式: 第一(yi)種形式的(de)trap命(ming)令在shell接(jie)收到signal list清單中數(shu)值(zhi)相同的(de)信號時,將執行雙引(yin)號中的(de)命(ming)令串(chuan)。
trap "commands" signal-list
為了恢復信號的默認操作,使用第二種形式的trap命令:
第三種形式的trap命令允許忽視信號: 注意:
(1)對信號11(段違例)不能捕捉,因為shell本身需要捕捉該信號去進行內存的轉儲。 另(ling)外,在trap語(yu)句中(zhong),單(dan)引(yin)號(hao)(hao)和雙引(yin)號(hao)(hao)是不同(tong)的(de)(de)(de),當shell程(cheng)序(xu)第一次碰(peng)到(dao)trap語(yu)句時,將把commands中(zhong)的(de)(de)(de)命令掃描一遍(bian)。此時若(ruo)commands是用單(dan)引(yin)號(hao)(hao)括起來(lai)的(de)(de)(de)話,那(nei)么(me)shell不會(hui)對commands中(zhong)的(de)(de)(de)變量(liang)和命令進行(xing)替(ti)換,否則commands中(zhong)的(de)(de)(de)變量(liang)和命令將用當時具(ju)體的(de)(de)(de)值(zhi)來(lai)替(ti)換。
發表評論
|