bash 中 () {} [] [[]] (()) 的解釋

bash 中 () {} [] [[]] (()) 的解釋

來源  https://www.cnblogs.com/fhefh/archive/2011/04/16/2017895.htmlhtml

 

bash下有不少像{}、[]等一些符號命令,下面是我對一些經常使用的符號命令的學習筆記,如有錯誤或紕漏望各位兄弟指正。

1、.(source)
.(點)與source命令同樣,從文件中讀取並執行命令,不管該文件是否都有可執行權限都可以正確的執行。且是在當前shell下執行,而不是產生一個子shell來執行(咱們一般使用「./filename.sh」去執行一個文件是在當前shell下產生一個子shell去執行的)。因此在設置bash的環境的變量時,就必須用該命令或者source命令去執行設置的環境變量纔會對當前shell生效,以下:

shell

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done
bash


2、:
: 該命令什麼都不作,但執行後會返回一個正確的退出代碼,即exit 0。好比在if語句中,then後面不想作任何操做,可是又不能空着,這時就可使用「:」來解決,以下:

學習

if [ "$i" -ne 1 ];then
    :
else
    echo "$i is not equal 1"
fi
測試


3、()
() 將多個命令組合在一塊兒執行,至關於一個命令組。

4、{}
{}  和()相似,也是將多個命令組合在一塊兒。它們之間的區別是,()是在產生的子shell下執行,而{}是在當前的shell下執行。這與前面講到是使用".  filename.sh"和"./filename.sh"的區別同樣。舉一個很簡單的例子:
 spa

# A=123
 
(A=abc;echo $A);echo $A
abc
123
# { A=abc;echo $A; };echo $A
abc
abc
code


從上面的示例能夠看出,當在()中賦值的變量,影響的只是自身的子shell,而不能將該值賦給父shell,由於「父親不能繼承兒子」。而在{}中賦值的變量,由於就在當前的shell執行的,因此就能改變原來變量的值。
注意:()裏面兩邊能夠不使用空格,{}裏面兩邊必須使用空格,且最後一個命令也須要以「;」結尾,表示命令結束。

5、[](test)
[] 與test命令同樣,用於比較值以及檢查文件類型。以下:
一、[ "$A" = 123 ]:是字符串的測試,以測試 $A 是否爲 一、二、3 這三個連續的"文字"。
二、[ "$A" -eq 123 ]:是整數的測試,以測試 $A 是否等於"一百二十三"。
三、[ -e "$A" ]:是關於文件的測試,以測試 123 這份"文件"是否存在。

6、[[]]
[[]]能夠說是[]的「加強版」,它可以將多個test命令支持的測試組合起來,例如:

htm

# [[ (-d "$HOME") && (-w "$HOME") ]] && echo echo "home is a writable directory"  
blog

home is a writable directory
繼承


至於這二者的區別有位仁兄已經寫的很清楚了,我將其整理一下:

數字測試: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致
文件測試: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致
字符串測試: > < =(同==) != -n -z,不可以使用「<=」和「>=」,[[ ]]同 [ ]
<

SPAN style="COLOR: rgb(0,1,2)">一致,但在[]中,>和<必須使用\進行轉義,即\>和\<
邏輯測試: []爲 -a -o ! [[ ]] 爲&& || !
數學運算: [] 不可使用 [[ ]]可使用+ - */ %
組合: 都可用各自邏輯符號鏈接的數字(運算)測試、文件測試、字符測試


拿這二者對字符串的測試舉一個例子,以下:

# [ a \> 1 ] && echo ture || echo false
ture
# [[ a > 1 ]] && echo ture || echo false
ture


字符串的比較是根據相應的ASCII碼來比較的,因此a>1是成立的。若是有興趣也能夠思考一下爲何會出現下面的結果?

# [[ a > 1 ]] && echo ture || echo false
ture


7、(())
(())專門來作數值運算,若是表達式求值爲 0,則設置退出狀態爲 1;若是求值爲非 0 值,則設置爲 0。不須要對 (( 和 )) 之間的操做符轉義。算術只對整數進行。除 0 會產生錯誤,但不會產生溢出。能夠執行 C 語言中常見的算術、邏輯和位操做。以下:

# ((i=1+99));echo $i
100


也能:

# i=99;((i++));echo $i
100


除此以外,也可使用$(())直接進行數值運算,以下:

# echo $((2**3))
8


注意:使用 (( )) 時,不須要空格分隔各值和運算符,使用[]和[[ ]] 時須要用空格分隔各值和運算符。 
  

===================== End

相關文章
相關標籤/搜索