一、小括號,圓括號()
1、單小括號 ()
2、雙小括號 (( ))
二、中括號,方括號[]
1、單中括號 []
2、雙中括號[[ ]]
例子:
- if ($i<5)
- if [ $i -lt 5 ]
- if [ $a -ne 1 -a $a != 2 ]
- if [ $a -ne 1] && [ $a != 2 ]
- if [[ $a != 1 && $a != 2 ]]
- for i in $(seq 0 4);do echo $i;done
- for i in `seq 0 4`;do echo $i;done
- for ((i=0;i<5;i++));do echo $i;done
- for i in {0..4};do echo $i;done
三、大括號、花括號 {}
1、常規用法
2、幾種特殊的替換結構
${var:-string},${var:+string},${var:=string},${var:?string}
② ${var:+string}的替換規則和上面的相反,即只有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量 var的值,即空值。(因為變量var此時為空,所以這兩種說法是等價的)
③${var:?string}替換規則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標准錯誤中,並從腳本中退出。我們可利用此特性來檢查是否設置了變量的值。
補充擴展:在上面這五種替換結構中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出。
3、四種模式匹配替換結構
模式匹配記憶方法:
# 是去掉左邊(在鍵盤上#在$之左邊)
% 是去掉右邊(在鍵盤上%在$之右邊)
#和%中的單一符號是最小匹配,兩個相同符號是最大匹配。
${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
第一種模式:${variable%pattern},這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最短的匹配模式第二種模式: ${variable%%pattern},這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式
第三種模式:${variable#pattern} 這種模式時,shell在variable中查找,看它是否一給的模式pattern開始,如果是,就從命令行把variable中的內容去掉左邊最短的匹配模式
第四種模式: ${variable##pattern} 這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式
這四種模式中都不會改變variable的值,其中,只有在pattern中使用了*匹配符號時,%和%%,#和##才有區別。結構中的pattern支持通配符,*表示零個或多個任意字符,?表示僅與一個任意字符匹配,[...]表示匹配中括號里面的字符,[!...]表示不匹配中括號里面的字符。
- # var=testcase
- # echo $var
- testcase
- # echo ${var%s*e}
- testca
- # echo $var
- testcase
- # echo ${var%%s*e}
- te
- # echo ${var#?e}
- stcase
- # echo ${var##?e}
- stcase
- # echo ${var##*e}
- # echo ${var##*s}
- e
- # echo ${var##test}
- case
4、字符串提取和替換
${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
第一種模式:${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/pattern/pattern}表示將var字符串的第一個匹配的pattern替換為另一個pattern。。
第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換為另一個pattern。
- [root@centos ~]# var=/home/centos
- [root@centos ~]# echo $var
- /home/centos
- [root@centos ~]# echo ${var:5}
- /centos
- [root@centos ~]# echo ${var: -6}
- centos
- [root@centos ~]# echo ${var:(-6)}
- centos
- [root@centos ~]# echo ${var:1:4}
- home
- [root@centos ~]# echo ${var/o/h}
- /hhme/centos
- [root@centos ~]# echo ${var//o/h}
- /hhme/cenths
四、符號$后的括號
(1)${a} 變量a的值, 在不引起歧義的情況下可以省略大括號。
(2)$(cmd) 命令替換,和`cmd`效果相同,結果為shell命令cmd的輸,過某些Shell版本不支持$()形式的命令替換, 如tcsh。
(3)$((expression)) 和`exprexpression`效果相同, 計算數學表達式exp的數值, 其中exp只要符合C語言的運算規則即可, 甚至三目運算符和邏輯表達式都可以計算。
五、使用
1、多條命令執行
(1)單小括號,(cmd1;cmd2;cmd3) 新開一個子shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后可以沒有分號。
(2)單大括號,{ cmd1;cmd2;cmd3;} 在當前shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后必須有分號, 第一條命令和左括號之間必須用空格隔開。
對{}和()而言, 括號中的重定向符只影響該條命令, 而括號外的重定向符影響到括號中的所有命令。
例如:
#!/bin/bash str1="test1" str2="Test1" num1=33 num2=4 ###################string complare######### #1 [] use = if [ "$str1" = "$str2" ] then echo "#1 ${str1} equals to ${str2}" else echo "#1 ${str1} not e2 $str2" fi #2 [] use != if [ "$str1" != "$str2" ] then echo "#2 ${str1} not equals to ${str2}" else echo "#2 ${str1} eq2 $str2" fi #3 [] use \< (注意字符串之間不能有空格) if [ "${str1}"\<"${str2}" ] then echo "#3 ${str1} less than ${str2}" else echo "#3 ${str1} eq2 or grater than $str2" fi #4 [[]] use < if [[ "$str1" < "$str2" ]] then echo "#4 ${str1} less than ${str2}" else echo "#4 ${str1} eq2 or grater than $str2" fi #################### number complare ############################ #1 [] use -lt.-gt,-ge if [ "$num1" -lt "${num2}" ] then echo "${num1} less than ${num2}" else echo "${num1} eq2 or grater than $num2" fi #2 [] use \< is complare as string (錯誤的示范,不能在[]中使用轉義比較數字,會當成字符串比較) if [ "$num1" \< "${num2}" ] then echo "${num1} less than ${num2}" else echo "${num1} eq2 or grater than $num2" fi #3 (()) use < if (( "$num1" < "${num2}" )) then echo "${num1} less than ${num2}" else echo "${num1} eq2 or grater than $num2" fi #####################(()) use to number +-*/ ########################### echo "############# (()) use ro number +-*/% ##############" echo $(($num1 + $num2)) echo $(($num1 - $num2)) echo $(($num1 * $num2)) echo $(($num1 / $num2)) echo $(($num1 % $num2)) ####################### () ################### echo "############# \$() use like \`\` ##################" echo `which pwd` echo $(which pwd) ##################### \${} to get variables ######################### echo "################## \${var} is like \$var ################" echo ${str1} echo $str1
運行結果:
#1 test1 not e2 Test1 #2 test1 not equals to Test1 #3 test1 less than Test1 #4 test1 less than Test1 33 eq2 or grater than 4 33 less than 4 33 eq2 or grater than 4 ############# (()) use ro number +-*/% ############## 37 29 132 8 1 ############# $() use like `` ################## /usr/bin/pwd /usr/bin/pwd ################## ${var} is like $var ################ test1 test1
總結:
(1)$(cmd)與··(鍵盤上1左邊的~)一樣,都是命令替換,可以將執行結果提取出來
(2)[]使用的時候[ ]前后都必須有空格,且兩個字符或數字之間的比較符左右也必須有空格。
(3) []是test的另一種形式,[]中間只能使用= 和 != 比較字符串,如果使用< 、>需要進行轉義\。
[]中間如果比較數字需要用 -lt 等符號,不能使用\<比較數字,會當成字符串處理。
(4)[[]]可用於處理邏輯命令,也可以用於處理字符串是否相等,且使用<、>不用轉義符.
(5)(())可用於比較數字,且不用轉義,而且也可以用於數字計算,比較的時候也是用普通的>,<。(())計算的時候運算符與數字之間不能有空格,例如: sum=$(($sum+4))
(6)字符串比較 用[],與普通的<,>,=,!=符號,如果使用<,>需要轉義;或者使用[[]]比較字符串也是用普通符號不用轉義
數字比較用[]的時候用-lt,-gt等符號,不能使用\<(因為會當成字符串處理);或者用(())比較數字用普通符號不用轉義
(7)可以將$理解為取變量的符號,$var 或者 ${} ,在不影響語義的情況下可以省去{},但是最好寫上{}。例如:test=XXX.$testWWWW.這時候就必須加上{}變為${test}WWWW
更多的特殊符號參考:http://www.jb51.net/article/69966.htm