如何在Bash脚本中逐行读取文件?

4

我在网上搜索了这个问题,目前找到了两种解决方法:

   while read line; do
      commands
   done < "$filename"

并且

    for $line in $(cat $filename); do
       commands
    done

但是如果这些行中间有空格,那么这些方法都无法使用。例如,如果我们有一行类似于这样的内容:

  textextext text

它不会打印文本文本文本

但是

  textextext
  text

它将这些内容视为不同的行,我该如何避免这种情况发生?


你对以下哪一点感兴趣?a) 首尾空格 b) 中间空格(例如,多个空格)c) 只关注单行中的单词? - A.H.
2个回答

9

像这样吗?

while IFS= read line ; do
   something "$line"
done <"$file"

这里有一个简短的测试:

while IFS= read line ; do echo "$line"; done <<<"$(echo -e "a b\nc d")"
a b
c d

这不是我发布的一样吗?我认为如果该行有空格,它将无法运行。 - jonathan
谢谢,它现在运行得非常好。我在第一次测试中犯了一个错误。 - jonathan
3
另一个关键区别是在您的${line}变量周围添加了双引号。祝好运。 - shellter
不客气。双引号不会使它换行,不过 :) - Michael Krelin - hacker
1
你可能想根据 https://dev59.com/BWgu5IYBdhLWcg3w_b9V#10929955 添加 -r 选项来读取。 - Albino Cordeiro
显示剩余2条评论

7
您可以使用 readarray 命令(适用于 bash 4+ 版本)。
readarray lines < "$file"

那么

for line in "${lines[@]}"; 
do
    echo "$line"
done

请注意,默认情况下 readarray 甚至会包括每行的换行符。

1
readarray命令中的“-t”参数将“从每个读取的行中删除尾随换行符。” - Tripp Lilley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接