使用for循环bash脚本逐行读取文件[重复]

Posted

技术标签:

【中文标题】使用for循环bash脚本逐行读取文件[重复]【英文标题】:Reading files line by line in by using for loop bash script [duplicate] 【发布时间】:2013-10-04 04:51:08 【问题描述】:

比如说我有一个名为“tests”的文件,它包含

a
b
c
d

我正在尝试逐行读取此文件,它应该会输出

a
b
c
d

我创建了一个名为“read”的 bash 脚本,并尝试使用 for 循环读取此文件

#!/bin/bash
for i in $1; do //for the ith line of the first argument, do...
   echo $i  // prints ith line
done

我执行它

./read tests

但它给了我

tests

有谁知道发生了什么?为什么它打印“测试”而不是“测试”的内容?提前致谢。

【问题讨论】:

这能回答你的问题吗? Looping through the content of a file in Bash 【参考方案1】:
#!/bin/bash
while IFS= read -r line; do
  echo "$line"
done < "$1"

与其他响应不同,此解决方案可以处理文件名中包含特殊字符(如空格或回车)的文件。

【讨论】:

为了完全无损,请执行while IFS= read -r line -- 没有 "IFS=" 您将失去前导/尾随空格。 也可以将其作为管道执行,例如:ls -1 | while IFS= read -r line; do ... done。我还发现按照顺序更容易一些。【参考方案2】:

你需要这样的东西:

#!/bin/bash
while read line || [[ $line ]]; do
  echo $line
done < $1

展开后你写的会变成:

#!/bin/bash
for i in tests; do
   echo $i
done

如果您仍然想要 for 循环,请执行以下操作:

#!/bin/bash
for i in $(cat $1); do
   echo $i
done

【讨论】:

感谢您的回答。只是想知道,使用for循环是不可能做到的吗? @OKC 差不多。 @bobah 如果文件没有尾随换行符,最后一行将被跳过...read line || [ "$line" ]; 修复了该问题 @OKC,迈克尔的回答接近你想要做的,但我不推荐它。它一次读取整个文件并执行与set -- $(cat $somefile); while ([ "$1" ]) do stuff;shift;done 等效的操作,请注意,这里 $@ 将获得最多 N 个变量(输入文件中 $IFS 中每个字符的每个出现一个)......并且可以使用很多较大文件的内存【参考方案3】:

这对我有用:

#!/bin/sh

for i in `cat $1`
do
    echo $i
done

【讨论】:

打印“cat $1”:( -1,这会将文件中的每个 word 打印在单独的行上。虽然对于这个特定的例子没问题,但不要在一般情况下使用它 @OKC,那些是 反引号 而不是单引号。

以上是关于使用for循环bash脚本逐行读取文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Bash 逐行读取文件

c#使用for循环逐行读取excel数据很慢

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

Bash:逐行读取文件并将每个段作为参数处理到其他prog

shell:逐行读取文件内容

While循环重置Bash脚本中的数字变量[重复]