bash下. : () {} [] [[]] (())的解釋

http://blog.chinaunix.net/uid-20380484-id-1692999.html

 

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

一、.(source)
.(點)與source命令一樣,從文件中讀取並執行命令,無論該文件是否都有可執行權限都能夠正確的執行。且是在當前shell下執行,而不是產生一個子shell來執行(我們通常使用“./filename.sh”去執行一個文件是在當前shell下產生一個子shell去執行的)。所以在設置bash的環境的變量時,就必須用該命令或者source命令去執行設置的環境變量纔會對當前shell生效,如下:

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


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

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


三、()
() 將多個命令組合在一起執行,相當於一個命令組。

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

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


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

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

六、[[]]
[[]]可以說是[]的“增強版”,它能夠將多個test命令支持的測試組合起來,例如:

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

home is a writable directory


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

數字測試: -eq -ne -lt -le -gt -ge[[ ]][ ]一致
文件測試: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]][ ]一致
字符串測試: > < =(==)  !=  -n  -z,不可使用“<=”和“>=”,[[ ]][ ]
一致,但在[]中,><必須使用\進行轉義,即\>和\<
邏輯測試: []-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


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

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


也能:

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


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

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


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章