cag*_*gri 4 bash shell for-loop wildcard expansion
在这样的 for 循环中,
for i in `cat *.input`; do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
如果其中一个输入文件包含类似 的条目*a,它将给出以“a”结尾的文件名。
有没有一种简单的方法可以防止这种文件名扩展?
由于使用多个文件,通配符 ( set -o noglob) 不是一个好的选择。我也应该能够过滤输出cat以转义特殊字符,但是
for i in `cat *.input | sed 's/*/\\*'`
...
Run Code Online (Sandbox Code Playgroud)
仍然会导致*a扩张,而
for i in `cat *.input | sed 's/*/\\\\*'`
...
Run Code Online (Sandbox Code Playgroud)
给我\*a(包括反斜杠)。[我想这是一个不同的问题]
这将遍历所有文件cat的内容并遍历结果行:
while read -r i
do
echo "$i"
done < <(cat *.input)
Run Code Online (Sandbox Code Playgroud)
如果文件包含通配符,它们将不会被扩展。他们的关键是不要使用for和引用你的变量。
在不支持进程替换的 Bourne 派生 shell 中,这等效:
cat *.input | while read -r i
do
echo "$i"
done
Run Code Online (Sandbox Code Playgroud)
在 Bash 中不这样做的原因是它创建了一个子外壳,当子外壳(循环)退出时,其中设置的变量值和任何cd目录更改都将丢失。