Bash - 转换逗号分隔列表

时间:2014-03-30 09:11:11

标签: bash

我正在尝试编写一个适用于文件列表的脚本。如果我想处理同一目录中的所有文件,那么

FILES=*.ext

for i in $FILES; do
  something on "$i"
done

工作正常,当我想要处理一些文件而不是一切时,问题就出现了。如何将逗号分隔的文件列表转换为可能包含或不包含相同格式的空格,以便我可以将其存储在$ FILES中并使用相同的代码?

非常感谢,提前

David Shaw

2 个答案:

答案 0 :(得分:2)

正确的做法是不使用分隔的文件名列表但使用数组(并避免使用大写变量名),这样可以避免包含分隔符的文件名问题(例如,)并且是惯用的的方法:

files=( *foo*.ext1 *bar*.ext2 file1 "file 2 with a space" )

for file in "${files[@]}"; do
    [ -e "${file}" ] || continue
    do_something_with "${file}"
done

除非你无法控制$files的填充方式,否则这就是你想要的,如果你的脚本被输入一个以逗号分隔的列表并且你完全无法避免它,那么你可以相应地设置IFS在@ BroSlow的answer

因为在使用空格扩展文件名时,globbing做正确的事情不是问题(甚至在你的例子中都没有)。

您可能还想检查extended globbing (extglob)是否能够更具体地匹配。

答案 1 :(得分:1)

如果我正确地解释你的问题你可以只用中的内部字段分隔符(IFS)来逗号,然后用分词来处理其余部分,例如

#!/bin/bash

FILES="file1,file2 with space,file3,file4 with space"

IFS=','
for i in $FILES; do
  echo "File = [$i]"
done

哪个会输出

File = [file1]
File = [file2 with space]
File = [file3]
File = [file4 with space]

注意,如Adrian Frühwirth pointed out in comments,如果文件名可以包含逗号,则会失败。