4

在这样的 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(包括反斜杠)。[我想这是一个不同的问题]

4

2 回答 2

5

这将遍历所有文件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目录更改都将丢失。

于 2011-02-24T23:26:10.650 回答
0

对于您拥有的示例,一个简单的cat *.input将做同样的事情。

于 2011-02-24T23:25:56.453 回答