由于這裡是在bash下做的實驗,有些地方與csh略有不同,詳情:
http://www.cnblogs.com/itech/archive/2012/02/21/2361184.html
一、linux指令中的特殊字元
1. 雙引号"
(1)列印輸出時将系統保留符号屏蔽、以保證正常輸入,如:
echo Alix; Mary
echo "Alix; Mary"
*分号;表示一個指令結束、另一個 指令開始執行,如果不加"的話,則隻輸出Alix,執行到Mary時會報錯
(2)在雙引号中引用其他指令輸出符,如引用變量:
name="mary"
echo "Alix;$name"
echo "$name"
*當然,在第三行指令中不加”也能執行出正确的結果,但是為了在編寫大型腳本時降低錯誤率,建議養成把特殊引用符都放到“内的良好習慣
此外,還可以直接引用指令輸出,這時要用反引号`把指令字括起來(下面會詳細講道):
echo "Now time: `date -u` "
(3)在指令中使用雙引号避免shell誤解,如:
name="jhon alix jack;mary roman"
echo $name | grep "jhon alix"
echo $name | grep jhon alix
第二行由于使用了",能夠正确執行、找到包含jhon alix的變量,但如果不加、第三行指令會報錯。
2. 單引号‘
單引号的用途和雙引号一緻,此外還表示引用中的引用,因為shell中不允許一條指令中的兩個引号都使用雙引号或單引号;如:
awk 'BEGIN{system("date")}'
3. 反引号`:指令引用符,如:
ls -l `cat /etc/shells`
echo "Now time: `date +'%T'`"
echo "Are using this system users: `who | awk '{ARR [FNR]=$1;}END {printf "%s %s\n" ,ARR[1],Arr[2];}'`"
4. 變量引用和指令轉換符$,如:
#将指令date的執行結果賦給變量a
a=`date`
echo "The time is: $a"
#如果是csh,需要在變量名前面加set
#下面的格式,隻能在bash裡用,csh裡會隻能用ls -l `cat /etc/shells`實作該功能
ls -l $(cat /etc/shells)
5. 屏蔽特殊符号字元\,如:
#bash格式
echo "Please pay \$15."
echo "Tom:\"What is your name?\""
6. 字元範圍比對符[]
#檢視目前目錄中以kls中任意字幕開頭的所有檔案:
ls -l [kls]*
#檢視檔案名中包含0~9的檔案:
ls -l *[0-9]*
#檢視檔案名中包含a~Z的檔案:
ls -l *[a-Z]*
7. 範圍排除[!]
#檢視檔案名是三個字元且第一個在0~9範圍、第二個不在0~9範圍、第三個任意的檔案:
ls -l [0-9][!0-9]*
*此外還有單字通配符?,多字通配符*
8. 邏輯或||
command1 || command2
先執行command1,如果成功則直接顯示結果、跳過command2;否則再執行command2
例1:
mail -f /root/mbox >/dev/null || echo "Permission denied"
9. 邏輯與&&
command1 && command2
和邏輯或相反,先執行command1,如果成功,才執行command2;否則執行終止:
wget http://www.baidu.com &>/dev/null && echo "`date` Host baidu service is running."
可以和下面的語句比較一下結果的不同:
wget http://www.baidu.com || echo "`date` Host baidu service is running."
10. 括号:
如果将指令放到圓括号内,執行多指令時會優先執行括号内的指令;而花括号則在函數中被使用(見第17章)
二、指令中的正規表達式:
正規表達式不止在shell腳本中使用,平時在grep、vi、awk、sed等指令工具中也可以使用。
1. 與檔案名比對同理,使用反斜杠\屏蔽特殊字元,如:
# ; $ ` " . ^ ? [ ] \ || &&
(1)比如做乘法運算時:
expr 25 \* 25
625
(2)在指令中輸出特殊符号:
echo \#notes\\
#notes\
(3)表示檔案名^^.txt
/\^\^\.txt/
2. 單字元比對符.
*使用查找模式時,通常要将表達式放入兩個斜杠 //中,然後再放入指令中。後面不在贅述。
/.i../,有可能比對到xian,就這個意思。
3. *單/多字元比對符
4. 行首比對符^
用來比對每一行第一列中符合搜尋條件的字元串:
/^eth0/
5. 行尾比對符$
與上面類似,用來比對行尾符合搜尋條件的字元串:
/love$/
雖然其他行也有love這個詞,但如果它不在行尾、就不會被搜尋到
6. 範圍比對[ ]和排除範圍比對符[^],使用方式如下:
[a-Z] (等同于[a-z A-Z])
/[Ll]ove/
[0-9]
[^a-Z]
7. 詞首\<、詞尾比對符\>:
搜尋以eth0四個字元開頭的文本:
grep -rl "\<eth0" *
*這裡注意和^$差別
搜尋以love結尾的文本:
grep -rl /love\>/ *
搜尋包含整個單詞the的文本:
grep -rl /\<dropped\>/ *
8. 重複次數比對符 X\{\}
搜尋目前檔案夾下字母r出現2次的文本:
grep -rl "r\{2\}" *
搜尋目前檔案夾下字母r至少出現2次的文本:
grep -rl "r\{2,\}" *
搜尋目前檔案夾下字母r出現2至10次的文本:
grep -rl "r\{2,10\}" *
搜尋目前檔案夾下單詞Link至少出現1次的文本:
grep -rl "Link\{1,\}" *
9. 正規表達式舉例:
搜尋包含IP位址的檔案:
grep -rl "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" *