IT系統(tǒng)集成商

系統(tǒng)集成 | 虛擬化應(yīng)用 | 群暉網(wǎng)絡(luò)存儲(chǔ) | 視頻會(huì)議 | 數(shù)據(jù)防泄密 | 技術(shù)運(yùn)維

手機(jī): 130-1534-6247   電話: 0351-2396570

bash、shell、正則表達(dá)式

為什么要將Bash、shell、正則表達(dá)式三個(gè)部分的內(nèi)容放在一起?在學(xué)習(xí)中體會(huì)到上述三部分的部分語法(表達(dá)式)特別容易混淆,所以放在一起作個(gè)總結(jié)。

1. 變量賦值

    格式:變量名=變量值
    等號(hào)兩邊不能有空格符。
  1. 變量值中有空格可以使用雙引號(hào)“”或者單引號(hào)‘’括起來,雙引號(hào)內(nèi)的$保留原有特性(雙如var="lang is $LANG" ,將在取得$LANG的內(nèi)容后賦予變量var);單引號(hào)內(nèi)的內(nèi)容視為一般字符。
  2. 需要通過命令提供信息的,可以使用$(命令)或者`命令`的方式,比如var=$(uname -r)
  3. 兩個(gè)字符串可以直接連接,比如:name="Welcome to " ;name="$name"linux;結(jié)果namer的值為“Welcome to linux”
  4. 變量類型默認(rèn)為字符串,所以sum=100+30 ;sum的值是字符串"100=30"  ;而不是數(shù)字130 ;
  5. 推薦使用 declare  [-air]  變量名  的方式明確聲明變量。

​​​​2. 變量取值

  1. 兩種方式:$變量名   或者    ${變量名}
  2. 數(shù)組元素取值  ${數(shù)組元素名}

3. 變量內(nèi)容刪除、替換

  1. 設(shè)變量:var=http://www.aaa.com/123.htm
  2. #從左邊開始刪除,第一次遇到(符合條件最短的)
    • echo ${var#*//}
    • 即刪除http://
  3. ​##從左邊刪除,最后遇到的(符合條件最長的)
    • echo ${var##*/}
    • 即刪除http://www.aaa.com/
  4. %從右邊刪除,第一次遇到的
    • echo ${var%/*}
    • 即刪除/123.htm
  5. %%從右邊刪除,最后一次遇到的
    • echo ${var%%/*}
    • 即刪除//www.aaa.com/123.htm ;結(jié)果為:"http:"
  6. ${變量名/舊字符串/新字符串} 第一個(gè)“舊字符串”會(huì)被替換為“新字符串”
  7. ${變量名//舊字符串/新字符串} 全部“舊字符串”會(huì)被替換為“新字符串”

4. 變量內(nèi)容的測(cè)試與替換

  1. 類似于 var=${str-expr} ;var=${str:-expr}等等。“Oh,My god!” ,“記不住”,所以還是用后面的[條件]與if語名吧。

5. login shell 讀取流程

  1. login shell讀取流程

6. 使用source或者小數(shù)點(diǎn) . 都可以將配置文件的內(nèi)容讀進(jìn)當(dāng)前的shell環(huán)境,而不需要注銷。

7. bash中的通配符

  1. 通配符

8. 數(shù)據(jù)重定向

  1. 標(biāo)準(zhǔn)輸入(stdin):代碼為0,使用<或者<<;
  2. 標(biāo)準(zhǔn)輸出(stdout):代碼為1,使用>或者>>;
  3. 標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr):代碼為2,使用2>或者2>>(注意,明確寫出數(shù)字2)。
  4. /dev/null設(shè)備,輸出到此設(shè)備,所有的信息都被丟棄了。
  5. 將標(biāo)準(zhǔn)輸出、錯(cuò)誤輸出寫入同一個(gè)文件:
    • find / -name .bashrc >list 2>&1   或者(此處的&1可以理解為對(duì)標(biāo)準(zhǔn)輸出的引用)
    • find / -name .bashrc &>list
  6. 經(jīng)常會(huì)用前一個(gè)命令的stdout作為這次的stdin,某些命令要用文件名,該stdin與stdout可以利用減號(hào)-替代:
    • tar -cvf - /home | tar -xvf -
  7. 如果某命令如cat沒有文件名參數(shù),或者當(dāng)參數(shù)是-時(shí),則從stdin讀取。
    • cat >catfile <~/.bashrc
    • cat >catfile <<"eof"

9. 管道

  1. 管道僅能處理前一個(gè)命令的stdout,對(duì)stderr沒有處理能力。
  2. 每個(gè)管理后面的第一個(gè)數(shù)據(jù)必定是“命令”
  3. 雙向重定向tee(同時(shí)輸出自文件與屏幕):cat ~/.bashrc | tee catfile | more 

10. 選取命令cut 

  1. 以行為單位,進(jìn)行數(shù)據(jù)提取
  2. cut  -d  '分隔字符'  -f 字段列表,如 echo $PATH | cut -d ":" -f 3,5  (以:為分隔符進(jìn)行字段劃分,取出第3、第5個(gè)字段)
  3. cut -c 字符起始范圍,如 export | cut -c 12-       或者   12-20

11. 排序命令sort、uniq

  1. sort [-rntk] [file or stdin]
    • -n 使用數(shù)字進(jìn)行排序
    • -r 反向排序
    • -t 指定分隔符,
    • -k 行被分隔符分成若干個(gè)字段后,用哪個(gè)字段進(jìn)行排序
    • cat /etc/passwd | sort -t ‘:’ -k 3
  2. uniq重復(fù)行僅列出一個(gè),如last | cut -d "  " | sort | uniq 

12. 刪除與替換命令tr(不改變文件本身內(nèi)容)

  1. 將輸出的信息中的小寫字母變成大寫字母:last | tr '[a-z]'  '[A-Z]'

13. xargs命令

  1. 由于很多命令不支持管道來傳遞參數(shù),所以xargs命令就派上了用場(chǎng)。它擅長將標(biāo)準(zhǔn)輸入數(shù)據(jù)轉(zhuǎn)換成命令行參數(shù),xargs能夠處理管道或者stdin并將其轉(zhuǎn)換成特定命令的命令參數(shù)。如:將/etc/passwd內(nèi)的第一列取出,僅取三行,并用finger將每個(gè)帳號(hào)的信息顯示出來
  2. cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs finger
  3. find /sbin -perm +7000 | xargs ls-l (ls不支持管道)