初學Bash腳本編程,里面的各種括號,絕對是一個大坑,為了救人救己,以防再度入坑,特記錄如下:
一、單小括號:
1、創建子Shell。單個小括號用來創建一個子shell,子shell允許你在不影響當前shell的環境下去執行操作。例如:
pwd /root (cd /tmp;pwd) /tmp
又如,你在 home 目錄,cd 到 /tmp 目錄,sleep 5 秒,最后 cd 回 home,但是你會在 sleep 的過程中按 Ctrl + c 中斷。命令如下:
~$ cd /tmp/; sleep 5; cd ~ ^C /tmp$
你會留在 /tmp 目錄中,因為最后的 cd ~
根本沒執行。所以如果你希望臨時切換別的目錄執行某些命令,但又希望中斷后回到原來的目錄,這個方法就不湊效了。
但是如果你加上小括號:
~$ ( cd /tmp/; sleep 5; ) ^C ~$
這里沒有最后的 cd ~
,因為多此一舉,subshell 有自己的工作目錄,相當於你另外開一個終端而已,這樣避免一些環境變量被某些代碼弄亂。
2、小括號還有命令替換的功能,result=$(command)與result=`command`有同樣的效果。
var=$(pwd) echo $var /root
3、用於初始化數組。如: array=(a b c d)
二、單方括號:
1、[和test是等同的,均是shell的內置命令,使用type測試一下:
[root@noi ~]# type [ [ is a shell builtin [root@noi ~]# type test test is a shell builtin
2、Test和[]中可用的比較運算符只有==和!=,兩者都是用於字符串比較的,不可用於整數比較,整數比較只能使用-eq,-gt這種形式。無論是字符串比較還是整數比較都不支持大於號小於號。如果實在想用,對於字符串比較可以使用轉義形式,如果比較"ab"和"bc":[ ab \< bc ],結果為真,也就是返回狀態為0。[ ]中的邏輯與和邏輯或使用-a 和-o 表示。
舉個例子(坑了我好一陣子,才弄明白):
#3比1大,返回0表示真,正確 [root@noi ~]# [ 3 \> 1 ];echo $? 0 #3比10小,返回0,錯誤,原因是[和test默認均是比較的字符串,而字符'3'比字符'1'(字符串“10”的第一個字符)大,所以返回真。 [root@noi ~]# [ 3 \> 10 ];echo $? 0
上面的例子中 [ 3 \> 10 ] 實際上shell執行的是 [ '3' \> '10' ] 這樣寫就清楚多了,呵呵。
3、需要注意的是:[]中每個字符之間必須由空格隔開,否則shell就會報錯。
4、如果真想比較數字,可以用:-gt(大於),-lt(小於),-ge(大於等於),-le(小於等於),-eq(等於),-ne(不能於)
[root@noi ~]# [ 3 -gt 1 ];echo $? 0 [root@noi ~]# [ 3 -gt 10 ];echo $? 1 [root@noi ~]# [ 5 -lt 2 ];echo $? 1 [root@noi ~]# [ 5 -gt 2 ];echo $? 0
5、最后一個坑,在[和test測試中,用0表示真(助記0表示沒有錯誤),用1表示假(助記1表示有錯誤),之所以要這樣搞,和c程序反着,
就是因為,shell負責接收其他程序的返回值,而返回值正確(對應一種情況),返回值錯誤(各種各樣的原因導致很多錯誤類型,需要用不同數值表示),
這樣的話,用0(表真)和其他值(表假)可以完美解決這個問題。可以這樣理解,除了返回0是正確的以外,返回其他值都是有問題的,呵呵。
以上是常規的用法,但是光這些還不夠啊,所以需要用到其他的表達式寫法,我先保存下,下篇接着寫。