我正在尝试使用文件夹中的文件填充数组,但如果名称中有空格,则会将它们拆分并且数组中填充单个单词.这是我尝试用下划线替换空格的代码:
array=($(ls)) | sed -r 's/ /_/g'
如何将ls项记录到bash数组中?
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(如何在bash中进行字符串操作?)中全面描述了这种语法.