2015-08-25 13 views
0

注視阿帕奇運行腳本/etc/init.d/apache2我實現String Manipulating不同的子串提取東西。例如:巴什 - 字符串操作減號( - )(連字符)

if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then 

if [ -n "${PIDTMP:-}" ] && kill -0 "${PIDTMP:-}" 2> /dev/null; then 

第二個似乎使用默認值如果PIDTMP是設置或者爲空,但我沒有發現它在這一邏輯。

每種情況下減號(-)的用法是什麼?簡單的解釋會有幫助。

注意:我只對大括號中的減號感興趣,我已經檢查過:-word

+1

這兩個是不同的。第一個從'$ APACHE_CONFDIR'的前面剝去'/ etc/apache2-',第二個默認爲空字符串,這似乎是非常無用的('「$ {PIDTMP}」''是' PIDTMP'未設置)。 – dhke

+0

有時多餘的添加會讓人困惑,但是感謝您的評論:) –

回答

1

在我看來,這並沒有真正的效果。 :-的解釋是:「如果不設置,使用下面的默認值」,但因爲沒有遵循,據我所知它沒有任何效果:

  • 如果變量被設置,則默認值將不會採取
  • 如果變量未設置,它將擴展爲「」,這在使用"${PIDTMP}"時會發生。

唯一的使用情況下,我能想象是確保擴大至少包含空字符串,而不是一個「未設置變量」(這個有差別時,-u選項有效)。

bash man page

$ {參數:-word}使用默認值。如果參數未設置或爲空,則替換單詞的擴展。否則,參數的值將被替換。

-u款待未設置變量和參數比特殊參數"@""*"作爲誤差進行參數擴展時其他。如果嘗試在未設置的變量或參數上進行擴展,則shell將輸出錯誤消息,如果不是交互式,則會以非零狀態退出。

+0

謝謝。我會期待合乎邏輯的答案,但看起來好像是這樣。也許這是歷史問題。 –

+0

是的,任何腳本都可以有「歷史剩菜」:) –

+0

bash的'-n'選項也適用於未設置的參數,所以如果我們刪除了: - 無處不在,那麼腳本將完全相同。 –