2009年10月1日 星期四

變數值代換(variables substitution)精簡筆記

變數值代換相較於指令代換,是一般使用者比較少碰到的;不過當你要成為一位合格的bash/csh programmer,變數值代換可是要跟吃飯喝水一樣自然。

Case 1. ${variable-'defaultValue'}
意義:當variable不存在時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在此變數名稱。

結果:

Maxsolar
       <---沒有輸出
可以發現,第一行的Maxsolar是利用變數值替換得來的,但是事實上我們並沒有真的設定myname,因此echo的結果為無。

Case 2. ${variable:-'defaultValue'}
意義:當variable不存在或為空值時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在或變數值不改變。

結果:

Maxsolar
       <---空的輸出
可以發現,由於myname存在但為空值,因此暫時被設定成Maxsolar,但隨即變失去了Maxsolar這個值,因此第一行輸出Maxsolar,第二行的輸出為空值(請注意跟case 1的「沒有輸出」看起來一樣,意義卻不相同)。

Case 3. ${variable:='defaultValue'}
意義:表示variable若不存在或為空值,則指定defaultValue給variable。variable將在整個script裡都為defalutValue。
這是最為常見的變數值替換。

結果:

Maxsolar
Maxsolar
可以發現,由於myname是空值,因此利用":="將myname的值永久設定成Maxsolar(所謂永久,指的是在此script的生命週期裡)。因此兩個輸出都會是Maxsolar。
事實上,在我們的終端機裡控制命令列最前面的 使用者名稱@主機名稱:工作路徑 的這個表示法,就是在~/.bashrc裡利用此變數替換方法來達成的:

Case 4. ${variable:?'defaultValue'}
意義:若variable不存在或為空值,則會出現在std err上,以檢查變數值是否被正確設定。
此變數值替代表示法常用在debug,而不會真正用在可執行的script上,遇到錯誤就會直接停止,無法利用std err導向輸出。

結果:

test.sh: line 32: myname: Maxsolar
因為myname被預期設定值為Maxsolar,但是卻是空值,因此會觸發一個標準錯誤輸出,script嘎然而止。

Case 5. ${variable:+'defaultValue'}
意義:表示variable若已被設定,則本行的variable暫時被設定為defalutValue,但整個script裡的variable未被改變。

結果:

maxubuntu
Maxsolar
可以發現:myname非空值,因此將會被暫時設定成maxubuntu;但是myname的值不會因此改變,仍然是Maxsolar。

好險,變數值的替換就這五種類型,多看個兩次就可以完全懂了。

小節:

  1. 只想測試變數是否為空值:
    可以用"-", ":-"來檢查,且指定的值只有一行的生命。
  2. 若某變數沒有值,就賦值給他:
    可以用":="來指定
  3. 想檢查該變數值是否為某值:
    利用":?"來debug囉!!
  4. 想臨時改變某一個有值的變數:
    利用":+"來賦值。
  5. 想永久改變某一個有值的變數:
    婀,你一定忘記變數值是可以被override的!直接將某變數指定值給他就可以啦!別想太複雜囉!

沒有留言: