bash、shell、正則表達式
為什么要將Bash、shell、正則表達式三個(gè)部分的內容放在一起?在學(xué)習中體會(huì )到上述三部分的部分語(yǔ)法(表達式)特別容易混淆,所以放在一起作個(gè)總結。1. 變量賦值
格式:變量名=變量值
等號兩邊不能有空格符。
- 變量值中有空格可以使用雙引號“”或者單引號‘’括起來(lái),雙引號內的$保留原有特性(雙如var="lang is $LANG" ,將在取得$LANG的內容后賦予變量var);單引號內的內容視為一般字符。
- 需要通過(guò)命令提供信息的,可以使用$(命令)或者`命令`的方式,比如var=$(uname -r)
- 兩個(gè)字符串可以直接連接,比如:name="Welcome to " ;name="$name"linux;結果namer的值為“Welcome to linux”
- 變量類(lèi)型默認為字符串,所以sum=100+30 ;sum的值是字符串"100=30" ;而不是數字130 ;
- 推薦使用 declare [-air] 變量名 的方式明確聲明變量。
2. 變量取值
- 兩種方式:$變量名 或者 ${變量名}
- 數組元素取值 ${數組元素名}
3. 變量?jì)热輨h除、替換
- 設變量:var=http://www.aaa.com/123.htm
- #從左邊開(kāi)始刪除,第一次遇到(符合條件最短的)
- echo ${var#*//}
- 即刪除http://
- ##從左邊刪除,最后遇到的(符合條件最長(cháng)的)
- echo ${var##*/}
- 即刪除http://www.aaa.com/
- %從右邊刪除,第一次遇到的
- echo ${var%/*}
- 即刪除/123.htm
- %%從右邊刪除,最后一次遇到的
- echo ${var%%/*}
- 即刪除//www.aaa.com/123.htm ;結果為:"http:"
- ${變量名/舊字符串/新字符串} 第一個(gè)“舊字符串”會(huì )被替換為“新字符串”
- ${變量名//舊字符串/新字符串} 全部“舊字符串”會(huì )被替換為“新字符串”
4. 變量?jì)热莸臏y試與替換
- 類(lèi)似于 var=${str-expr} ;var=${str:-expr}等等。“Oh,My god!” ,“記不住”,所以還是用后面的[條件]與if語(yǔ)名吧。
5. login shell 讀取流程
6. 使用source或者小數點(diǎn) . 都可以將配置文件的內容讀進(jìn)當前的shell環(huán)境,而不需要注銷(xiāo)。
7. bash中的通配符
8. 數據重定向
- 標準輸入(stdin):代碼為0,使用<或者<<;
- 標準輸出(stdout):代碼為1,使用>或者>>;
- 標準錯誤輸出(stderr):代碼為2,使用2>或者2>>(注意,明確寫(xiě)出數字2)。
- /dev/null設備,輸出到此設備,所有的信息都被丟棄了。
- 將標準輸出、錯誤輸出寫(xiě)入同一個(gè)文件:
- find / -name .bashrc >list 2>&1 或者(此處的&1可以理解為對標準輸出的引用)
- find / -name .bashrc &>list
- 經(jīng)常會(huì )用前一個(gè)命令的stdout作為這次的stdin,某些命令要用文件名,該stdin與stdout可以利用減號-替代:
- tar -cvf - /home | tar -xvf -
- 如果某命令如cat沒(méi)有文件名參數,或者當參數是-時(shí),則從stdin讀取。
- cat >catfile <~/.bashrc
- cat >catfile <<"eof"
9. 管道
- 管道僅能處理前一個(gè)命令的stdout,對stderr沒(méi)有處理能力。
- 每個(gè)管理后面的第一個(gè)數據必定是“命令”
- 雙向重定向tee(同時(shí)輸出自文件與屏幕):cat ~/.bashrc | tee catfile | more
10. 選取命令cut
- 以行為單位,進(jìn)行數據提取
- cut -d '分隔字符' -f 字段列表,如 echo $PATH | cut -d ":" -f 3,5 (以:為分隔符進(jìn)行字段劃分,取出第3、第5個(gè)字段)
- cut -c 字符起始范圍,如 export | cut -c 12- 或者 12-20
11. 排序命令sort、uniq
- sort [-rntk] [file or stdin]
- -n 使用數字進(jìn)行排序
- -r 反向排序
- -t 指定分隔符,
- -k 行被分隔符分成若干個(gè)字段后,用哪個(gè)字段進(jìn)行排序
- cat /etc/passwd | sort -t ‘:’ -k 3
- uniq重復行僅列出一個(gè),如last | cut -d " " | sort | uniq
12. 刪除與替換命令tr(不改變文件本身內容)
- 將輸出的信息中的小寫(xiě)字母變成大寫(xiě)字母:last | tr '[a-z]' '[A-Z]'
13. xargs命令
- 由于很多命令不支持管道來(lái)傳遞參數,所以xargs命令就派上了用場(chǎng)。它擅長(cháng)將標準輸入數據轉換成命令行參數,xargs能夠處理管道或者stdin并將其轉換成特定命令的命令參數。如:將/etc/passwd內的第一列取出,僅取三行,并用finger將每個(gè)帳號的信息顯示出來(lái)
- cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs finger
- find /sbin -perm +7000 | xargs ls-l (ls不支持管道)