在这样的 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
(包括反斜杠)。 [我想这是一个不同的
但问题]
这会cat
the contents所有文件并迭代结果行:
while read -r i
do
echo "$i"
done < <(cat *.input)
如果文件contain通配字符,它们不会被扩展。他们的钥匙是不要使用for
并引用你的变量。
在不支持进程替换的 Bourne 派生 shell 中,这是等效的:
cat *.input | while read -r i
do
echo "$i"
done
在 Bash 中不这样做的原因是它创建一个子 shell,当子 shell(循环)退出时,其中设置的变量值和任何cd
目录更改将会丢失。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)