2011-02-24 115 views
4

在为这样的循环,如何防止文件名扩展为循环在bash

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

如果输入文件的一个包含条目像*a,会,并给 文件名中的“一结束”。

有没有防止这种文件名扩展的一个简单的方法?

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

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

还是引起了*a扩大,而

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

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

+0

你想要做的事,每个行或在输入文件中的每个字?因为如果其中一个输入文件包含例如FOO跳回到bar.txt那么for循环会做一个迭代与我设置为foo,和一个与我设置为跳回到bar.txt – 2016-05-10 14:48:34

回答

0

对于你的例子,一个简单的cat *.input将做同样的事情。

+0

感谢和遗憾,并为早期没有说明,但以股代息的方式过于复杂转储在这里。 '回声$ i'只是一个占位符('cat'在for循环也grep的/ SED /切割的复杂组合)。如果我能得到这个'echo'声明来打印文件中的内容,其余部分将被解决。 – cagri 2011-02-25 00:04:25

4

这将cat内容的所有文件和遍历结果的行:

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

如果包含的通配符的文件,他们将不会扩大。他们的钥匙是不要使用for并引用你的变量。

在不支持进程替换的Bourne衍生壳,这相当于:

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

的理由不这样做,在击是它创建一个子shell并且当所述子外壳(循环)退出,在任何目录中设置的变量值将会丢失。