我正在尝试编写一个适用于文件列表的脚本。如果我想处理同一目录中的所有文件,那么
FILES=*.ext
for i in $FILES; do
something on "$i"
done
工作正常,当我想要处理一些文件而不是一切时,问题就出现了。如何将逗号分隔的文件列表转换为可能包含或不包含相同格式的空格,以便我可以将其存储在$ FILES中并使用相同的代码?
非常感谢,提前
David Shaw
答案 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)
如果我正确地解释你的问题你可以只用bash中的内部字段分隔符(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,如果文件名可以包含逗号,则会失败。