【问题标题】:Reading files line by line in by using for loop bash script [duplicate]使用for循环bash脚本逐行读取文件[重复]
【发布时间】: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

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

【问题讨论】:

标签: bash for-loop


【解决方案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,那些是 反引号 而不是单引号。
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多