2015-05-04 50 views
3

我正在通過apache啓動腳本閱讀,試圖解決與我的服務器的一些問題,但在開始時有一個參數擴展,我真的不明白。

SCRIPTNAME="${0##*/}" 
SCRIPTNAME="${SCRIPTNAME##[KS][0-9][0-9]}" 
if [ -n "$APACHE_CONFDIR" ] ; then 
    if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then 
      DIR_SUFFIX="${APACHE_CONFDIR##/etc/apache2-}" 
    else 
      DIR_SUFFIX= 
    fi 
elif [ "${SCRIPTNAME##apache2-}" != "$SCRIPTNAME" ] ; then 
    DIR_SUFFIX="-${SCRIPTNAME##apache2-}" 
    APACHE_CONFDIR=/etc/apache2$DIR_SUFFIX 
else 
    DIR_SUFFIX= 
    APACHE_CONFDIR=/etc/apache2 
fi 

我只是在尋找一些澄清的問題是$ {參數##字}構造做,因爲從gnu bash的參考手冊是我也不清楚。手動定義它像這樣...

$ {參數#字} $ {參數##字}

字被擴展,以產生一個模式,就像在文件名擴展(見文件名擴展) 。如果模式匹配 參數擴展值的開頭,則 擴展的結果是匹配模式最短的 匹配模式('#'情況)或最長匹配模式( '# #'情況)刪除。如果參數爲'@'或'*',則依次對每個位置參數應用模式刪除操作 ,並且 擴展是結果列表。如果參數是以'@'或'*'爲下標的數組變量 ,則將模式移除操作依次應用 給數組的每個成員,並且擴展爲 結果列表。

這是否意味着第一行將一個空字符串存回SCRIPTNAME或者我剛剛離開基地?

+0

的''的特殊處理''你突出顯示的是'*'作爲'parameter',在'SCRIPTNAME =「$ {0 ## * /}」'中,'*'作爲'word'的一部分出現 – John1024

+2

記錄,這個參數擴展不是一個GNU擴展 - 它是POSIX(雖然Bash也有一些自定義擴展形式)。更多的規範定義可以在[opengroup]找到(http://pubs.opengroup.org/ onlinepubs/009695399 /公共事業/ xcu_chap02.html#tag_02_06_02)。 – kojiro

回答

2

第一行將當前文件的basename存儲在SCRIPTNAME中。 $0(通常)是當前腳本的名稱。請參閱this討論相關問題。

然後,第二行中的`$的文件的一部分{參數##字}條從名字K##S##前綴(假定/etc/init.d鏈路命名約定。