为什么你不读 bash 中带有“for”的行?

为什么你不读 bash 中带有“for”的行?

我读到过,使用“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

也可以看看:

相关内容