2012-07-12 30 views
1

我正在嘗試製作一個shell腳本的正面或反面。有人可以解釋這一行嗎?For shell腳本中的循環 - 冒號和散列標記?

$ FILEDIR是一個包含文件的目錄。 F是從此命令返回的文件數組中的標記: files = $(find $ FILEDIR -type f | grep -v .rpmsave \ $ | grep -v .swp \ $)

令人困惑行在for循環內。

for f in $files; do 
target=${f:${#FILEDIR}} 
<<do some more stuff>> 
done 

我從來沒有見過冒號和散列在shell腳本for循環之前。我一直無法找到任何文件......有人可以嘗試啓發我嗎?我會很感激。

+0

bash中的$ {f:$ {#FILEDIR}}給出的結果與更便攜的表達式'$ {f#$ FILEDIR}'相同。這兩個表達式都從'$ f'中刪除'$ FILEDIR'前綴。第二個表達式是首選。 – 2012-07-16 21:32:29

回答

2

這裏沒有涉及到數組。 POSIX sh沒有數組(假設你沒有使用基於標籤的其他shell)。

冒號表示Bash/Ksh substring expansion。這些也不是POSIX。前綴#展開爲參數中的字符數。我想他們打算砍掉目錄部分並將其分配給target

要解釋的休息:第一find運行和歡快的管道分成兩裏grep該做些什麼本來可以單獨找到(除了打破包含換行符可能的文件名)來完成,而輸出保存到files。如果僅限於POSIX工具,這也是不能真正做到的,但有更好的方法。

接着,files進行更ridiculousways膨脹unquoted和mutalated由外殼爲for環路在沒有意義的結果迭代。如果腳本的其餘部分很糟糕,可能會拋出並重新開始。沒有辦法達到預期的效果。

+0

太好了,謝謝你的鏈接。我找到了我正在解析的rpm文件,並試圖理解這一行,因爲它會影響單點登錄軟件包的安裝方式。我們的安全團隊希望我們部署它,但無法提供它所做的更改列表,因此我們無法確定它會破壞什麼。非常感謝 - 我想我會運行差異並製作補丁文件:) – Matthew 2012-07-12 20:00:22