Introduction
變數值代換相較於指令代換,是一般使用者比較少碰到的;不過當你要成為一位合格的bash/csh programmer,變數值代換可是要跟吃飯喝水一樣自然。
Case 1. ${variable-'defaultValue'}
意義:當 variable 不存在時,將variable暫時指定成 defaultValue。所謂「暫時」,是指此行之後,在整個 script 裡 variable 都還是不存在此變數名稱。範例代碼如下:
- t1.sh
- #!/bin/sh
- unset myname
- echo "myname = '${myname-default value}'"
- echo "myname = '${myname}'"
可以發現,第一行的 'default value' 是利用變數值替換得來的,但是事實上我們並沒有真的設定 myname,因此第二行的 echo 的結果為空。
Case 2. ${variable:-'defaultValue'}
意義:當 variable 不存在或為空值時,將 variable 暫時指定成 defaultValue。所謂「暫時」,是指此行之後,在整個 script 裡 variable 都還是不存在或變數值不改變。
- t2.sh
- #!/bin/sh
- myname=
- echo "myname = '${myname:-default value}'"
- echo "myname = '${myname}'"
Case 3. ${variable:='defaultValue'}
意義:表示 variable 若不存在或為空值,則指定 defaultValue 給 variable。variable 將在整個 script 裡都為 defalutValue。這是最為常見的變數值替換。
- t3.sh
- #!/bin/sh
- myname=
- echo "myname = '${myname:=default value}'"
- echo "myname = '${myname}'"
可以發現,由於 myname 是空值,因此利用":="將 myname 的值永久設定成 'default value' (所謂永久,指的是在此script的生命週期裡)。因此兩個輸出都會是 'default value'。事實上,在我們的終端機裡控制命令列最前面的 使用者名稱@主機名稱:工作路徑 的這個表示法,就是在 ~/.bashrc 裡利用此變數替換方法來達成的.
Case 4. ${variable:?'defaultValue'}
意義:若 variable 不存在或為空值,則會出現在 std err 上,以檢查變數值是否被正確設定。此變數值替代表示法常用在 debug,而不會真正用在可執行的 script 上,遇到錯誤就會直接停止,無法利用 std err 導向輸出。
- t4.sh
- #!/bin/sh
- myname=
- echo "myname = '${myname:?default value}'"
- echo "myname = '${myname}'"
因為 myname 被預期設定值為 'default value',但是卻是空值,因此會觸發一個標準錯誤輸出,script 嘎然而止。
Case 5. ${variable:+'defaultValue'}
意義:表示 variable 若已被設定,則本行的 variable 暫時被設定為 defalutValue,但整個 script 裡的 variable 未被改變。
- t5.sh
- #!/bin/sh
- myname=John
- echo "myname = '${myname:+default value}'"
- echo "myname = '${myname}'"
可以發現:myname 非空值,因此將會被暫時設定成 'default value';但是 myname 的值不會因此改變,仍然是 John。
沒有留言:
張貼留言