如何在bash中防止for循环中的文件名扩展

时间:2011-02-24 23:15:46

标签: bash shell for-loop wildcard expansion

在像这样的for循环中,

for i in `cat *.input`; do
    echo "$i"
done

如果其中一个输入文件包含*a之类的条目,它将会给出 以'a'结尾的文件名。

是否有一种阻止此文件名扩展的简单方法?

由于使用了多个文件,通配符(set -o noglob)不是 不错的选择。我还应该能够将cat的输出过滤到 转义特殊字符,但

for i in `cat *.input | sed 's/*/\\*'`
    ...

仍会导致*a展开,而

for i in `cat *.input | sed 's/*/\\\\*'`
    ...

给了我\*a(包括反斜杠)。 [我想这是一个不同的 问题虽然]

2 个答案:

答案 0 :(得分:4)

这将cat所有文件的内容并迭代结果行:

while read -r i
do
    echo "$i"
done < <(cat *.input)

如果文件包含通配符,则不会展开它们。它们的关键是不使用for并引用您的变量。

在不支持进程替换的Bourne派生shell中,这是等效的:

cat *.input | while read -r i
do
    echo "$i"
done

在Bash中不这样做的原因是它创建了一个子shell,当子shell(循环)退出时,设置在其中的变量值和任何cd目录更改都将丢失。

答案 1 :(得分:0)

对于您的示例,一个简单的cat *.input将执行相同的操作。