我已經繼承了一個shell腳本。它所做的一件事就是解析一個文件名列表。對於列表中的每個文件名它下面的命令:bash參數擴展更改原始字符串
fs_item="`echo ${fs_item%/}`"
此命令替換文件名的空間與一個空間(從做它的工作,在這種情況下,我認爲,是消除最後一個斜線之後的所有部分) :
in: aa bbbb ccc
out: aa bbbb ccc
從這一點起,文件名已損壞。
所以,問題是:我可以以某種方式告訴bash不要取代空格嗎?
我已經繼承了一個shell腳本。它所做的一件事就是解析一個文件名列表。對於列表中的每個文件名它下面的命令:bash參數擴展更改原始字符串
fs_item="`echo ${fs_item%/}`"
此命令替換文件名的空間與一個空間(從做它的工作,在這種情況下,我認爲,是消除最後一個斜線之後的所有部分) :
in: aa bbbb ccc
out: aa bbbb ccc
從這一點起,文件名已損壞。
所以,問題是:我可以以某種方式告訴bash不要取代空格嗎?
回聲真的有必要嗎?你可以簡單地將其刪除:
fs_item="${fs_item%/}"
如果你的實際的問題是不同的東西,你無法擺脫的回聲(或其他一些命令調用),加入一些報價應該工作:
fs_item="`echo \"${fs_item%/}\"`"
運行反撥命令echo
時,空間消失。內部字段分隔符包含空格字符,因此由一個或多個空格序列分隔的單詞將作爲單獨參數傳遞給echo
。然後,echo只打印它由一個空格分隔的參數。
由於我們的內部字段分隔主體,改變了IFS也應該工作(但通常有其他可能的不良影響的其他地方在你的腳本):
IFS=$'\n'
該內部磁場分離器設置到換行符。在此之後,空間不再被視爲列表的分隔符。 echo命令將只接收一個參數(除非您的文件名中帶有換行符),並且空格將保持不變。
嘗試將IFS設置爲其他內容,例如IFS =「,」
擺脫反引號和回聲命令。在這種情況下,它比無用的更糟糕,因爲它沒有增加任何內容,並導致您在此嘗試解決的問題。
fs_item="${fs_item%/}"
這個我不清楚..如果你不想要行fs_item =「`echo $ {fs_item%/}`」來替換空格,那麼刪除那一行。 – nos 2009-07-27 14:55:17
我已添加評論。該命令出於其他原因,bot替換空格 – 2009-07-27 15:02:21