from: http://www.cnscn.org/htm_data/133/0903/21818.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"-ne1 ]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 "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 ]&&echoture ||echofalse
ture
# [[a >1 ]]&&echoture ||echofalse
ture
字符串的比較是根據相應的ASCII碼來比較的,所以a>1是成立的。如果有興趣也可以思考一下爲什麼會出現下面的結果?
# [[a >1 ]]&&echoture ||echofalse
ture
七、(())
(())專門來做數值運算,如果表達式求值爲 0,則設置退出狀態爲 1;如果求值爲非 0 值,則設置爲 0。不需要對 ((和 ))之間的操作符轉義。算術只對整數進行。除 0 會產生錯誤,但不會產生溢出。可以執行 C 語言中常見的算術、邏輯和位操作。如下:
# ((i=1+99)) && echo$i
100
也能:
# i=99 && ((i++)) && echo$i
100
除此之外,也可以使用$(())直接進行數值運算,如下:
# echo $((2**3))
8
注意:使用 (( )) 時,不需要空格分隔各值和運算符,使用[]和[[ ]] 時需要用空格分隔各值和運算符