在像这样的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
(包括反斜杠)。 [我想这是一个不同的
问题虽然]
答案 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
将执行相同的操作。