2013-08-25 88 views
0

有人能告訴我以下2個功能是如何工作的嗎?我無法在eval部分找到我的頭。 這些代碼片斷來自系統腳本上Openwrt.Thank你瞭解2殼功能

list_contains() { 
     local var="$1" 
     local str="$2" 
     local val 

     eval "val=\" \${$var} \"" 
    [ "${val%% $str *}" != "$val" ] 
} 


append() { 
     local var="$1" 
     local value="$2" 
     local sep="${3:- }" 

     eval "export ${NO_EXPORT:+-n} -- \"$var=\${$var:+\${$var}\${value:+\$sep}}\$value\"" 
} 
+0

'男人bash'有所有的答案。 'set -xv'也可以提供幫助。 – choroba

回答

0

這些功能都使用shell變量替換。

SH $變量= prefixandsuffix SH $回聲 「$ {變量#前綴}」 andsuffix SH $回聲 「$ {變量%後綴}」 prefixand

%%##變體替代最長的可能匹配,而上面的功能將取代最短的匹配。

因此${val%% $str *}試圖刪除包含空白的$str後綴,後面是任何內容。如果沒有匹配,則不會刪除任何內容,因此${val%% $str *}等於$val

由此,我覺得這很麻煩。我會寫這個函數,而不是簡單地作爲

case " $val " in *" $str "*) true;; *) false;; esac 

同樣,append函數試圖在一個相當迂迴的方式來追加值的列表。該功能使用默認值。

sh$ echo "${variable:-value_if_unset}" 
prefixandsuffix 
sh$ echo "${another:-value_if_unset}" 
value_if_unset 
sh$ echo "${variable:+foo}" 
foo 
sh$ echo "x${another:+foo}" 
x 

複雜eval這裏的目的是剛剛變量設置爲它新的價值,如果它不是之前設置,否則將其設置爲舊值,然後分離器和新的價值附加。

再次,似乎這將是簡單的書面只是

variable="${variable}${variable:+ }newvalue" 

內聯,而不是訴諸一個相當複雜的功能。