進階變數設定

Bash shell 可以讓您對變數設定做預先的條件判斷,變數設定的結果視該變數的初始狀況而定。

共有四種常用的進階變數設定:

第 1 種:
result=${str:-value}

若 $str 不空,則 result 的內容為 str
若 $str 為空,則 result 的內容為 value

例:
str="/home/ols3"
result=${str:-/bin/sh}
echo $result

結果為:/home/ols3

例:
str=
result=${str:-/bin/sh}
echo $result

結果為:/bin/sh

=====================

第 2 種:
result=${str:=value}

若 $str 為空,則 result 的內容為 value,且同時把 $str 也設為 value !

例:
str="/home/ols3"
result=${str:=/bin/sh}
echo "\$result is $result"
echo "\$str is $str"

結果為:
$result is /home/ols3
$str is /home/ols3

例:
str=
result=${str:=/bin/sh}
echo "\$result is $result"
echo "\$str is $str"


結果為:
$result is /bin/sh
$str is /bin/sh

=====================

第 3 種:
result=${str:?msg}

若 $str 不空,則 result 的內容為 str
若 $str 為空,則 顯示錯誤訊息 msg


=====================

第 4 種:
result=${str:+value}

若 $str 不空,則 result 的內容為 value
若 $str 為空,則不做取代

另,Bash 有以下截取設定變數之法:


r="/usr/local/bin/sftp"

m=${r##*/}

上式是說把 r 中符合 */ 這種目錄結構最長的部份刪去,把其右方剩下的部份設定給 m
即 m=sftp
其中 ## 代表 "符合最長的" 之意, */ 代表以 / 結束的任意字串。

m=${r#*/}
上式是說把 r 中符合 */ 的部份予以刪除(最短的)
此時 m=usr/local/bin/sftp

m=${r%/*}

上式是說把 r 中符合 /* 這種目錄結構的右方部份刪除
即 m=/usr/local/bin
其中 % 代表 "符合的" 之意, /* 代表以 / 開始的任意字串。

m=${r%%/*}
上式 %% 是說把 r 中符合 /* 的最長的部份的右方予以刪除
此時 m 為空