一.小括號
grep -E "^(s|S)" /etc/init.d/functions #以s或S開頭的行
grep -E "^(root|laowang)\>" /etc/passwd|cut -d : -f7 #查看用戶名是root或laowang的shell
grep -E "(root)+" /etc/passwd #至少包含一個root的行
echo "/etc/sysconfig/-network-scripts/" |sed -r 's@^(.*/)([^/]+/?)@\1@' 取目錄
[ $# -ne 0 ] && (echo "error";exit) #這樣不會退出,因為小括號開了子進程,不會退出當前進程
[ $# -ne 0 ] && { echo error;exit; } #這樣可以,注意大括號兩邊有空格
可以進行算數運算、比較,可以進行邏輯運算,但不支持 -a -o ! 等邏輯運算
if (($num <= 127 & $num > 0)); then
echo OK
fi
二.中括號 2.1單中括號[]
等價于test,注所以[和]的前后需要加空格
2.2雙中括號[[ ]]
①[[是 bash 程序語言的關鍵字。并不是一個命令,[[ ]] 結構比[ ]結構更加通用。在[[和]]之間所有的字符都不會發生文件名擴展或者單詞分割,但是會發生參數擴展和命令替換。
②支持字符串的模式匹配,使用=~操作符時甚至支持shell的正則表達式。字符串比較時可以把右邊的作為一個模式,而不僅僅是一個字符串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字符串或通配符,不需要引號。
③使用[[ ... ]]條件判斷結構,而不是[ ... ],能夠防止腳本中的許多邏輯錯誤。比如,&&、||、 操作符能夠正常存在于[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不適用雙括號, 則為if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。
三.大括號 3.1、常規用法
①大括號拓展。(通配())將對大括號中的文件名做擴展。在大括號中,不允許有空白,除非這個空白被引用或轉義。第一種:對大括號中的以逗號分割的文件列表進行拓展。如 touch {a,b}.txt 結果為a.txt b.txt。第二種:對大括號中以點點(..)分割的順序文件列表起拓展作用小括號的使用方法小括號的使用方法,如:touch {a..d}.txt 結果為a.txt b.txt c.txt d.txt
ls {ex1,ex2}.sh
ex1.sh ex2.sh
ls {ex{1..3},ex4}.sh

ex1.sh ex2.sh ex3.sh ex4.sh
ls {ex[1-3],ex4}.sh
ex1.sh ex2.sh ex3.sh ex4.sh
3.2字符串提取&替換②代碼塊,又被稱為內部組,這個結構事實上創建了一個匿名函數 。與小括號中的命令不同,大括號內的命令不會新開一個子shell運行,即腳本余下部分仍可使用括號內變量。括號內的命令間用分號隔開,最后一個也必須有分號。{}的第一個命令和左括號之間必須要有一個空格。
第一種模式:${var:num},shell在var中提取第num個字符到末尾的所有字符。若num為正數,從左邊0處開始;若num為負數,從右邊開始提取字串,但必須使用在冒號后面加空格或一個數字或整個num加上括號,如${var: -2}、${var:1-3}或${var:(-2)}。
第二種模式:${var:num1:num2},num1是位置,num2是長度。表示從$var字符串的第$num1個位置開始提取長度為$num2的子串。不能為負數。
第三種模式:${var//}表示將var字符串的第一個匹配的替換為另一個。
第四種模式:${var///}表示將var字符串中的所有能匹配的替換為另一個。
3.3正則表達式
ifconfig | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" #搜索IP
(1)${a} 變量a的值, 在不引起歧義的情況下可以省略大括號。
(2)$(cmd) 命令替換,和`cmd`效果相同,結果為shell命令cmd的輸,過某些Shell版本不支持$()形式的命令替換, 如tcsh。
(3)$(()) 和``效果相同, 計算數學表達式exp的數值, 其中exp只要符合C語言的運算規則即可, 甚至三目運算符和邏輯表達式都可以計算。