使用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脚本逐行读取文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章