https://blog.csdn.net/honghuzhilangzixin/article/details/7073312/
在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的字符。
原文:https://blog.csdn.net/ieearth/article/details/52589020
* 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 --------------------- 以上例子轉自https://blog.csdn.net/ieearth/article/details/52589020
三元運算符
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 : cccccc 7 # llllll 8 echo 222221 9 } 10 11 fun 12 13 [root@localhost test]# sh test.sh 14 1222 15 222221