我读到过,使用“for”并不是在 bash 中读取行的好方法。很多人说这很笨拙,效率很低,而且在很多情况下都会失败。
我想知道在 bash 中读取行的最佳方法是什么。谢谢。
例如:
$ for i in $(<afile); do echo "$i"; done
答案1
您正在谈论for line in $(cat file); do
和类似的结构。这是:
- 效率低下,因为 bash 必须生成一个子 shell 并执行
cat
,读取cat
输出 –整个文件– 进入内存,解析它(也就是最慢的部分),然后才迭代所有数据 - 不可靠,因为 bash 执行单词拆分在数据上 - 它不仅根据换行符进行拆分,还根据 $IFS 中的任何内容(空格、制表符......)进行拆分
(如果使用$(<...)
而不是$(cat ...)
,您可以在 Linux 上节省两毫秒,但其他所有缺点仍然存在。)
更好的选择是使用read
在一个while
环形:
while read -r line; do
echo "Input: $line"
done < myfile.txt
或者从程序中:
cat file1 file2 file3 |
while read -r line; do
echo "Input: $line"
done
它只读取需要的部分,不会执行不必要的处理,但允许自定义字段拆分,并且对于大文件来说速度要快很多倍,对资源的要求也更低。
如果您尝试使用的输出find
,则应使用相同的模式:
find . -name "foo" -type f -print0 | while read -r -d '' file; do
echo "File: $file"
done
也可以看看:
- 格雷格的维基。为什么你不读带有“for”的句子
- 格雷格的维基。Bash 常见问题解答 #001:如何逐行读取文件?