bash 括號(小括號,雙小括號,中括號,雙中括號,大括號)


小括號()和大括號{}

主要包括一下幾種

  • ${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、支持多個表達式運算,各個表達式之間用“,”分開

使用實例:

  • 擴展四則運算
1
2
3
4
5
6
7
8
9
10
11
#!/bin/sh
 
a=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/sh
a=1;
b= "ab" ;
echo  $((a>1?8:9));
((b!= "a" ))&& echo  "err2" ;
((a<2))&& echo  "ok" ;

 

運行結果:

sh testsh.sh
9
err2
ok

  • 擴展流程控制語句(邏輯關系式)
 
#!/bin/sh
num=100;
total=0;
for ((i=0;i<=num;i++));
do
     ((total+=i));
done
echo  $total;
 
total=0;
i=0;
while ((i<=num));
do
     ((total+=i,i++));
done
echo  $total;
 
if ((total>=5050)); then
     echo  "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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM