2012-02-23 98 views
1

在我的bash腳本我有這個變量,包含一個目錄列表從tar排除在外,再加上他們的父目錄中的一個進行處理:如何「扁平」列表變量?

EXLIST="\ 
--exclude='/data/sub1/*' \ 
--exclude='/data/sub2/*' \ 
--exclude='/data/sub3/*' \ 
/data \ 
" 

echo ${EXLIST} | /usr/bin/xargs -0 tar -cf _data.tar 

然而,焦油懦弱拒絕創建一個空的檔案,因爲什麼替代${EXLIST}後真的接收到的是:

echo --exclude='/data/sub1/*' | /usr/bin/xargs -0 tar -cf /home/_data.tar 

告訴我,新行的方式獲得?

我當然可以將EXLIST定義爲一條長線,但我不喜歡,因爲這會使列表不易讀。

有沒有辦法,在bash,把這些行「扁化」爲一個字符串,這樣tar可以處理它嗎?

回答

3

在這種情況下,你應該使用一個數組,沒有xargs。

EXLIST=("--exclude='/data/sub1/*'" \ 
     "--exclude='/data/sub2/*'" \ 
     "--exclude='/data/sub3/*'" \ 
     "/data") 

tar -cf _data.tar "${EXLIST[@]}" 

使用此方法時,數組的每個元素都是tar的單獨參數。

+0

實際上,我的基於字符串的EXLIST和基於數組的EXLIST **之間唯一的區別是,在回顯**時,2個空格(在我的)和1個(在你的)之間。但是......您的回答幫助我解決了將'$ {EXLIST}'作爲參數傳遞給另一個不帶引號的腳本的問題。一旦我將'$ {EXLIST [@]}'改爲'「{{EXLIST [@]}」'',這兩種形式都運行得很好。所以接受你的答案。 – ateiob 2012-02-23 21:41:50

+1

@ateiob我認爲你可能會誤解引號和數組是如何工作的。回顯時輸出的內容與傳遞給命令的參數不一樣。我建議閱讀以下內容:http://mywiki.wooledge.org/Quotes http://mywiki.wooledge.org/BashFAQ/005 – jordanm 2012-02-23 21:49:18

+0

你說的就是我在評論中所說的話......沒有誤會。謝謝。 – ateiob 2012-02-24 05:05:20