2008年8月29日 星期五

bash 的特殊 command :

bash 是很複雜的,裡頭有很多特殊符號的用法,看起來像天書。command 中也有一個很特別的,但很好用的命令。這 command 只是一個冒號 :。這個冒號有點像 # 把後面的字串當註解,但它其實不是。它跟其他 command 一樣是 command, 所以語法要跟其他 command 等同視之。而 : 這 command 會把後面的字串當參數,該做 expansion 的也會做 expansion,比如 $1 會 expand 出第一個參數。但 : 不會把後面的參數拿來執行。而且最後會 return 0。

見下面 testcolon.sh
#!/bin/bash

set -x

echo "COLON test"
: echo "$*"
: $1

: [ $1 == bb ] && echo success || echo fail

set -x 是 debugtrace,可以把每行要執行前先 print 到 terminal。
./testcolon.sh aa bb cc 的輸出如下:
+ echo 'COLON test'
COLON test
+ : echo 'aa bb cc'
+ : aa
+ : '[' aa == bb ']'
+ echo success
success
我們可以看到 "$*" 跟 $1 都被 expand 出來。最後 echo 出 success 是因為 : command 一定會 return 0。要注意,它不是把整行「註解」掉,它跟 # 不同,不是拿來當註解用途。

最後要再強調一次,: 是 command,所以下面第一行的寫法是正確的,但第二行是錯誤的。
1) echo "comment test1"; date # this is a comment
2) echo "comment test2"; date : this is a comment