2015-12-09 20 views
2

我試圖用文件夾中的文件填充數組,但如果名稱中有空格,則會將它們拆分並將數組填充爲單個話。 這是我嘗試用下劃線來代替空格代碼:如何用bash數組中的所有條目中的下劃線替換空格

array=($(ls)) | sed -r 's/ /_/g' 

如何錄製LS項目爲一個bash數組?

+3

**從不嘗試編程使用'ls'輸出! http://mywiki.wooledge.org/ParsingLs –

+1

基本上 - 當你做'array =($(ls))'時,單個項目**不包含任何空格**,因爲任何名爲'name與空間'已經成爲四個單獨的數組條目:'名稱',''',''''''和'空間'。 –

+1

...你可以用IFS的自定義值來解決這個問題,但即使這樣也只適用於可能的文件名的子集;如何使用不可打印字符來執行任何版本的'ls'是實現定義的。 –

回答

7
array=(*)     # populate array with filenames 
array=("${array[@]// /_}") # convert spaces to underscores in all array elements 

爲了解釋:

  • array=($(ls))不能安全使用:非轉義的擴展擴展水珠(如果你有一個文件名爲*,它將與其他名稱的列表所替代)以及分裂默認情況下所有空格(即,名爲two words的文件將成爲兩個數組條目,第一個爲two,第二個爲words)。此外,帶有非可打印字符的ls的行爲是未定義的,其輸出包含文字換行符的文件必然不明確。
  • "${foo// /_}"是shell變量foo的擴展,所有空格替換爲下劃線。 (${foo/ /_}只會用下劃線替換第一個空格)。對於數組,應用通常的語法更改:${foo[@]// /_}。該語法在BashFAQ #100 (How do I do string manipulations in bash?)中進行了全面描述。
相關問題