小括號()和大括號{}
主要包括一下幾種
- ${var}
- $(cmd)
- ()和{}
- $((exp))
- ${var:-string},${var:+string},${var:=string},${var:?string}
- $(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)
1.shell變量應用原型 ${var}
2.變量替換 ${cmd}與`cmd`類似
注意:$(cmd)只輸出標准輸入,如果命令執行錯誤,則無輸出
3. 一串命令執行 ()和{},
二者都用於執行一串命令,指令之間用;分開,注意:括號內的數據重導向只影響括號內部的指令輸入輸出,不影響括號外部的指令
不同之處如下:
運行方式:
1)()重新開啟一個shell運行命令,{}在當前shell運行
2)()最后一條指令不需要; , {}最后一條指令需要;
3) {}第一個指令和左括號需要有空格,()不需要
下面是一個簡單的例子
1 $ var=test 2 $ (var=notest; echo $var) ###變量var值為notest,此是在子shell中有效 3 notest 4 $ echo $var ###父shell中值仍為test 5 test 6 $ { var=notest; echo $var;} ###注意左括號和var之間要有一個空格 7 notest 8 $ echo $var ###父shell中的var變量的值變為了notest 9 notest 10 $ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###輸出test1被重定向到文件a中, 11 test2 ###而test2輸出則仍輸出到標准輸出中。 12 $ cat a 13 test1 14 $ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括號內命令的標准輸出全部被重定向到文件a中 15 $ cat a 16 test1 17 test2
4.$((expr))用於執行數學運算,語法類似c語言
例子如下
1 $ echo $((3+2)) 2 5 3 $ echo $((3>2)) 4 1 5 $ echo $((25<3 ? 2:3)) 6 3 7 $ echo $var 8 9 $ echo $((var=2+3)) 10 5 11 $ echo $var 12 5 13 $ echo $((var++)) 14 5 15 $ echo $var 16 6 17 $
在剛開始學習inux shell腳本編程時候,對於它的 四則運算以及邏輯運算。估計很多朋友都感覺比較難以接受。特變邏輯運算符”[]”使用時候,必須保證運算符與算數 之間有空格。 四則運算也只能借助:let,expr等命令完成。 今天講的雙括號”(())”結構語句,就是對shell中算數及賦值運算的擴展。
使用方法:
語法:
((表達式1,表達式2…))
特點:
1、在雙括號結構中,所有表達式可以像c語言一樣,如:a++,b--等。
2、在雙括號結構中,所有變量可以不加入:“$”符號前綴。
3、雙括號可以進行邏輯運算,四則運算
4、雙括號結構 擴展了for,while,if條件測試運算
5、支持多個表達式運算,各個表達式之間用“,”分開
使用實例:
- 擴展四則運算
1234567891011#!/bin/sha=1;b=2;c=3;((a=a+1));echo$a;a=$((a+1,b++,c++));echo$a,$b,$c
運行結果:
sh testsh.sh
2
3,3,4雙括號結構之間支持多個表達式,然后加減乘除等c語言常用運算符都支持。如果雙括號帶:$,將獲得表達式值,賦值給左邊變量。
- 擴展邏輯運算
#!/bin/sha=1;b="ab";echo$((a>1?8:9));((b!="a"))&&echo"err2";((a<2))&&echo"ok";
運行結果:
sh testsh.sh
9
err2
ok
- 擴展流程控制語句(邏輯關系式)
#!/bin/shnum=100;total=0;for((i=0;i<=num;i++));do((total+=i));doneecho$total;total=0;i=0;while((i<=num));do((total+=i,i++));doneecho$total;if((total>=5050));thenecho"ok";fi
運算結果:
sh testsh.sh
5050
5050
ok
有了雙括號運算符:[[]],[],test 邏輯運算,已經let,expr 都可以拋到一邊了。
5. ${var: } ,${var%}用於變量的替換和匹配替換結構
替換:
${var:-string} 若var為空,${var:-string}值為string
${var:=string} 與${var:-string}功能類型,不過${var:=string} 將string值賦給var變量
${var:=string} 判斷某個變量是否賦值,沒有的話則給它賦上一個默認值
${var:+string}的替換規則和${var:=string}相反,即只有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量 var的值,即空值
匹配:
${var%pattern}和${var%%pattern}表示從最右邊(即結尾)匹配的
${var#pattern} 和${var##pattern}從最左邊(即開頭)匹配的
中括號[] [[]]
一. bash [ ] 單雙括號
基本要素:
Ø [ ] 兩個符號左右都要有空格分隔
Ø 內部操作符與操作變量之間要有空格:如 [ “a” = “b” ]
Ø 字符串比較中,> < 需要寫成\> \< 進行轉義
Ø [ ] 中字符串或者${}變量盡量使用"" 雙引號擴住,避免值未定義引用而出錯的好辦法
Ø [ ] 中可以使用 –a –o 進行邏輯運算
Ø [ ] 是bash 內置命令:[ is a shell builtin
二.bash [[ ]] 雙方括號
基本要素:
Ø [[ ]] 兩個符號左右都要有空格分隔
Ø 內部操作符與操作變量之間要有空格:如 [[ “a” = “b” ]]
Ø 字符串比較中,可以直接使用 > < 無需轉義
Ø [[ ]] 中字符串或者${}變量盡量如未使用"" 雙引號擴住的話,會進行模式和元字符匹配
[root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"
ok
Ø [[] ] 內部可以使用 && || 進行邏輯運算
Ø [[ ]] 是bash keyword:[[ is a shell keyword
[[ ]] 其他用法都和[ ] 一樣
Ø [[ ]] 和 [ ] 都可以和 ! 配合使用
優先級 ! > && > ||
邏輯運算符 < 關系運算符
邏輯運算符 : ! && || -a -o
關系運算符 : < > \> \< == = != – eq –ne -gt -ge –lt -le
-----------------------------------------------------------------------------
n [[ ]] 比[ ] 具備的優勢
-----------------------------------------------------------------------------
①[[是 bash 程序語言的關鍵字。並不是一個命令,[[ ]] 結構比[ ]結構更加通用。在[[和]]之間所有的字符都不會發生文件名擴展或者單詞分割,但是會發生參數擴展和命令替換。
②支持字符串的模式匹配,使用=~操作符時甚至支持shell的正則表達式。字符串比較時可以把右邊的作為一個模式,而不僅僅是一個字符串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字符串或通配符,不需要引號。
③使用[[ ... ]]條件判斷結構,而不是[... ],能夠防止腳本中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。
④bash把雙中括號中的表達式看作一個單獨的元素,並返回一個退出狀態碼。
使用[[ ... ]]條件判斷結構, 而不是[ ... ], 能夠防止腳本中的許多邏輯錯誤. 比如,&&, ||, <, 和> 操作符能夠正常存在於[[]]條件判斷結構中, 但是如果出現在[ ]結構中的話, 會報錯。
參考:https://blog.csdn.net/claytonzeng/article/details/10267225
參考:https://blog.csdn.net/DLUTBruceZhang/article/details/9230757
