在Linux系統中,冒号(:)常用來做路徑的分隔符(PATH),資料字段的分隔符(/etc/passwd)等。其實,冒号(:)在Bash中也是一個内建指令,它啥也不做,是個空指令、隻起到占一個位置的作用,但有時候确實需要它。當然,它也有它的用途的,否則沒必要存在。在·Linux的幫助頁中說它除了參數擴充和重定向之外不産生任何作用。
gnu 幫助:http://www.gnu.org/software/bash/manual/bash.html#Bourne-Shell-Builtins
冒号(:)的作用
1)空指令。
2)參數擴充。
3)重定向。
4)當注釋使用。
了解冒号(:)
1)了解空指令。空指令就是什麼也不做,是以傳回碼永遠都是0。雖說是空指令,但仍是指令,就具備一般指令應有的特征,可以象一般指令一樣使用。如
1 [root@localhost test]# :2 [root@localhost test]# echo $?
3 0
4 [root@localhost test]#
可以直接在console中執行。傳回碼為0。
利用這一特性,:可以當true使用。如用在while等循環體中的條件判斷。
2)了解參數擴充。
冒号引起的參數擴充,意思是将參數的值替換為新的值。一般有以下幾種參數擴充用法:
1 ${parameter:-word} 如果parameter沒有設定或者為空,替換為word;否則替換為parameter的值2 ${parameter:+word} 如果parameter沒有設定或者為空,不進行任何替換;否則替換為word。3 ${parameter:=word} 如果parameter沒有設定或者為空,把word指派給parameter。實際parameterd的值真的被替換了,這就是=号的意思。不能用這種方式指派位置參數或特殊參數的值。4 ${parameter:?word} 如果parameter沒有設定或者為空,把word輸出到stderr,否則替換為parameter的值。
-、+、? 實際parameter的值并不被修改,擴充隻是臨時顯示成word的值。準确的講,擴充實際替換的是參數的顯示,而不是參數的定義。隻有=,才是替換參數的定義。5 ${parameter:offset} 擴充為parameter中從offset開始的子字元串。6 ${parameter:offset:length} 擴充為parameter中從offset開始的長度不超過length的字元。
* word前的“-”可以了解為“沒定義,則替換成word”;“+”可以了解為“有定義,則替換成word”。
* word前的“?”可以了解為“參數到底定義了沒,沒定義,把word當錯誤消息列印出來。”
$ foo=hellobash
$echo${foo}
hellobash
$echo ${foo:-newword}
hellobash
$echo${foo}
hellobash
$echo ${foo:+newword}
newword
$echo${foo}
hellobash
$echo ${foo:?newword}
hellobash
$echo${foo}
hellobash
$echo ${foo:=newword}
hellobash
$echo${foo}
hellobash
$ unset foo
$echo${foo}
$echo ${foo:-newword}
newword
$echo${foo}
$echo ${foo:+newword}
$echo${foo}
$echo ${foo:?newword}
bash: foo: newword
$echo${foo}
$echo ${foo:=newword}
newword
$echo${foo}
newword
$echo ${foo:2}
wword
$echo ${foo:2:3}
wwo---------------------
三元運算符
1 $ var=100
2 $ (($var>100?var++:var--))
3)重定向
1 : > test.file
2
3 cat test.file
cat 檔案,什麼也沒有。
4)當注釋用
使用冒号還可以用作注釋行的開始,但是如果有文法錯誤,仍将報錯,這一點與使用#号不同。如:
1 [root@localhost test]# cat test.sh
2
3 fun()4 {5 echo 1222
6 : cccccc7 # llllll8 echo 222221
9 }10
11 fun12