我试图编写一个脚本,该脚本在文件列表上工作。如果我想在同一个目录中的所有文件工作,然后Bash - 转换逗号分隔列表
FILES=*.ext
for i in $FILES; do
something on "$i"
done
工程确定,问题是当我想要的工作只是一个选择的文件,而不是一切。如何将逗号分隔的文件列表(可能包含或不包含空格)转换为相同的格式,以便我可以将其保存在$ FILES中并使用相同的代码?
非常感谢,提前
大卫·肖
我试图编写一个脚本,该脚本在文件列表上工作。如果我想在同一个目录中的所有文件工作,然后Bash - 转换逗号分隔列表
FILES=*.ext
for i in $FILES; do
something on "$i"
done
工程确定,问题是当我想要的工作只是一个选择的文件,而不是一切。如何将逗号分隔的文件列表(可能包含或不包含空格)转换为相同的格式,以便我可以将其保存在$ FILES中并使用相同的代码?
非常感谢,提前
大卫·肖
做的是不使用文件名的分隔列表,但使用一个数组(避免大写变量名)正确的事情,这将避免的问题包含您的分隔符(如,
)文件名和是惯用的做法:
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)
以便能够更具体地匹配。
如果我正确解释您的问题,您可以将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,如果文件名可以包含逗号,这将失败。
是的,但这不是你如何做到的。你只是改变了问题,现在它会用逗号分隔文件名。 –
@AdrianFrühwirth我仍然在解释这个问题,因为他有一个用逗号分隔的文件列表,并且想要遍历它。如果文件名本身可以包含逗号,那么问题几乎无法解决。 – BroSlow
我认为这是一个XY问题,OP只需要知道他们不应该存储 - 也不是必需的 - 一个逗号分隔的文件/模式列表。如果你使用一个数组并正确地做,你可以避免所有这些问题。 –
你介意提供一些样本数据吗? – Saucier