久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > Shell學習總結
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:用于保存注冊目錄的完全路徑名。
  PATH:用于保存用冒號分隔的目錄路徑名,shell將按PATH變量中給出的順序搜索這些目錄,找到的第一個與命令名稱一致的可執行文件將被執行。
  TERM:終端的類型。
  UID:當前用戶的標識符,取值是由數字構成的字符串。
  PWD:當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。
  PS1:主提示符,在特權用戶下,缺省的主提示符是“#”,在普通用戶下,缺省的主提示符是“$”。
  PS2:在shell接收用(yong)戶(hu)(hu)輸入(ru)(ru)命(ming)令(ling)的(de)過程中,如果用(yong)戶(hu)(hu)在輸入(ru)(ru)行的(de)末(mo)尾輸入(ru)(ru)“\”然后回車(che),或者當用(yong)戶(hu)(hu)按回車(che)鍵時shell判斷出(chu)用(yong)戶(hu)(hu)輸入(ru)(ru)的(de)命(ming)令(ling)沒有結束時,顯示這個輔助提示符,提示用(yong)戶(hu)(hu)繼續輸入(ru)(ru)命(ming)令(ling)的(de)其余部(bu)分,缺省的(de)輔助提示符是“>&rdquo;。

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命令:
  export 變量(liang)名=變量(liang)值(zhi)

使用(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)有:

$#:位置參數的數量
        $*:所有位置參數的內容
        $?:命令執行后返回的狀態
        $$:當前進程的進程號
        $!:后臺運行的后一個進程號
        $0:當(dang)前執行的(de)進程名

其(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的值。
        b. 變量=${參數=word}:如果設置了參數,則用參數的值置換變量的值,否則把變量設置成word然后再用word替換參數的值。注意,位置參數不能用于這種方式,因為在shell程序中不能為位置參數賦值。
        c. 變量=${參數?word}:如果設置了參數,則用參數的值置換變量的值,否則就顯示word并從shell中退出,如果省略了word,則顯示標準信息。這種變量要求一定等于某一個參數的值,如果該參數沒有設置,就顯示一個信息,然后退出,因此這種方式常用于出錯指示。
        d. 變量=${參數+word}:如果設置(zhi)了參數,則(ze)用word置(zhi)換變量(liang),否則(ze)不進行置(zhi)換。

所有這(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:等于則為真
        -ne:不等于則為真
        -gt:大于則為真
        -ge:大于等于則為真
        -lt:小于則為真
        -le:小于等(deng)于則為(wei)真(zhen)

(2)字符串測試:

=:等于則為真
        !=:不相等則為真
        -z字符串:字符串長度偽則為真
        -n字(zi)(zi)符串(chuan):字(zi)(zi)符串(chuan)長(chang)度不偽則(ze)為真

(3)文件(jian)測試(shi):

-e文件名:如果文件存在則為真
  -r文件名:如果文件存在且可讀則為真
  -w文件名:如果文件存在且可寫則為真
  -x文件名:如果文件存在且可執行則為真
  -s文件名:如果文件存在且至少有一個字符則為真
  -d文件名:如果文件存在且為目錄則為真
     -f文件名:如果文件存在且為普通文件則為真
  -c文件名:如果文件存在且為字符型特殊文件則為真
  -b文件(jian)名:如果文件(jian)存(cun)在且為塊特殊文件(jian)則為真

另(ling)外,Linux還提(ti)供了與(“!&rdquo;)、或(“-o)、非(“-a”)三個邏輯操作符用于將測試條件(jian)連(lian)接起來(lai),其優先(xian)級為(wei):“!”高,“-a”次之,“-o”低。

同時,bash也能完成簡單(dan)的算(suan)(suan)術運算(suan)(suan),格式如下:

$[expression]
        例如:var1=2
        var2=$[var1*10+1]
   &nbsp;  &nbsp; 則:var2的值(zhi)為21。

2) if條件語句

shell程(cheng)序中的條件分支是通過(guo)if條件語句來實現(xian)的,其一般格式為:

 if條件命令串
        then 
        條件為真時的命令串
        else 
        條件為假時的命令串
     &nbsp;   fi

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變量名
        [in數值列表]
        do 
        若干個命令行
         done

變(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 
        若干個命令行1
        do
        若干個命令行2
  &nbsp;     done

只要while的“若干個(ge)命令(ling)行1”中后一個(ge)命令(ling)的返回狀態為真,while循環就繼續(xu)執行do...done之間的“若干個(ge)命令(ling)行2”。

until命令是另一(yi)種循環結(jie)構,它(ta)和while命令相似,其(qi)格式(shi)如下:

until 
        若干個命令行1
        do 
        若干個命令行2
 &nbsp;      done

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 
        exp-1)
        若干個命令行1
        ;;
        exp-2)
        若干個命令行2
        ;;
        ……
        *)
        其他命令行
&nbsp;       esac

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
  {
  若干命令行
  }
  調用函數的格式為:
  functionname param1 param2……

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)執行一段程序來處理這一信號
  (2)接受信號的默認操作
  (3)忽視(shi)這一信號(hao)

trap對上面三種方式提供了三種基本形式:

第一(yi)種形式的(de)trap命(ming)令在shell接(jie)收到signal list清單中數(shu)值(zhi)相同的(de)信號時,將執行雙引(yin)號中的(de)命(ming)令串(chuan)。

trap "commands" signal-list
  trap "commands" signal-list

為了恢復信號的默認操作,使用第二種形式的trap命令:
  trap signal-list

第三種形式的trap命令允許忽視信號:
  trap " " signal-list

注意:

(1)對信號11(段違例)不能捕捉,因為shell本身需要捕捉該信號去進行內存的轉儲。
        (2)在trap中可以定義對信號0的處理(實際上沒有這個信號),shell程序在其終止(如執行exit語句)時發出該信號。
  &nbsp;     (3)在捕捉到signal-list中(zhong)指定的信號(hao)并執(zhi)行(xing)(xing)完相應的命令(ling)(ling)之(zhi)后,如(ru)果這些命令(ling)(ling)沒有將(jiang)(jiang)shell程(cheng)序(xu)(xu)終止的話(hua),shell程(cheng)序(xu)(xu)將(jiang)(jiang)繼續執(zhi)行(xing)(xing)收到信號(hao)時所執(zhi)行(xing)(xing)的命令(ling)(ling)后面的命令(ling)(ling),這樣將(jiang)(jiang)很容易導致shell程(cheng)序(xu)(xu)無(wu)法終止。

另(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)換。

 
發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)