Bash 使用'for'循环逐行读取
如何使用Bash 使用'for'循环逐行读取,bash,loops,for-loop,Bash,Loops,For Loop,如何使用for循环逐行读取 我所尝试的: hh=$(echo -e "\n1\n2\n3\n4\n") IFS=$'\n'; for r in "$hh"; do echo $r; done 1 2 3 4 echo -e "$hh" 1 2 3 4 虽然在读取时使用肯定可以解决这个问题,但是如果您真的想使用for循环,那么您需要使用IFS=$'\n'来读取bash for循环中的输入字符串: hh=$(echo -e "\nname n1\nval n2\n3\nfoo n4\n")
for
循环逐行读取
我所尝试的:
hh=$(echo -e "\n1\n2\n3\n4\n")
IFS=$'\n';
for r in "$hh"; do echo $r; done
1 2 3 4
echo -e "$hh"
1
2
3
4
虽然在读取时使用
肯定可以解决这个问题,但是如果您真的想使用for循环
,那么您需要使用IFS=$'\n'
来读取bash for循环中的输入字符串
:
hh=$(echo -e "\nname n1\nval n2\n3\nfoo n4\n")
IFS=$'\n' && for r in $hh; do echo "r='$r'"; done
r='name n1'
r='val n2'
r='3'
r='foo n4'
使用while
循环:
$ while read -r r; do echo $r; done <<< "$hh"
1
2
3
4
$whileread-r;不要重复$r;done只有for循环中$hh变量的扩展不需要引用
这个代码有效
hh=$(echo -e "\n1\n2\n3\n4\n")
echo "Starting string"
echo -e "$hh"
IFS=$'\n';
echo "Original Code"
for r in "$hh"; do echo r is $r; done
echo "Fixed Code 1"
IFS=$'\n';
for r in "$hh"; do echo r is "$r"; done
echo "Fixed Code 2"
IFS=$'\n';
for r in $hh ; do echo r is $r ; done
生产,
Starting string
1
2
3
4
Original Code
r is 1 2 3 4
Fixed Code 1
r is
1
2
3
4
Fixed Code 2
r is 1
r is 2
r is 3
r is 4
从大约$hh
中删除引号,原始代码可以正常工作:
hh=$(echo -e "\n1\n2\n3\n4\n")
IFS=$'\n'
for r in $hh; do echo "Value: $r"; done
# output:
Value: 1
Value: 2
Value: 3
Value: 4
正确的答案是,你不能用for循环逐行阅读。使用while循环代替read
内置:
while IFS= read -r line; do
echo "$line"
done <<< "$hh"
而IFS=read-r行;做
回音“$line”
已完成对回声“t$r”的更改。
您将只看到回声once@anubhava还有一个问题。当一行包含许多单词时,它将不起作用。它要做的是逐字逐句地弹跳。这就是为什么需要IFS=$'\n'代码>这似乎不是work@Orlo:明白你的意思了。我根据您的评论更新了我的答案,请查看。我对这个答案投了反对票,因为它声明需要printf,这是不正确的。此解决方案有效的唯一原因是,$(printf“%s\n”“$hh”)
周围没有引号,如果在周围加引号,则与原始帖子一样失败。@XTian:同意,printf不是真正需要的,如果您看到编辑的历史,您将看到在此之前的情况。我将它回滚到我的上一个版本,因为它更正确。当然,但我需要for
loop@Orlo为什么需要为
设置?这里的答案是一个非常常见的成语。@BroSlow是的,有人对此投了反对票。不幸的是,我不想告诉你出了什么问题。@Orlo为什么在这里特别需要一个for
循环?@Orlo大文件是不使用for循环的一个很好的理由。它要求文本在循环开始之前展开和拆分。它可能需要shell分配内存中文本大小的两倍甚至三倍。尽管生成了正确的输出,但我的回答是错误的。您的答案不能产生正确的输出$r需要被引用,否则它将删除任何空行,并在给定IFS时弄乱转义,类似于a=“a b c”;echo$a
打印a b c
。同样的原因“$hh”也需要被引用。然而,这个循环正确地覆盖了字符串,这就是为什么在我看来,目前为止唯一有效的答案是devnull
“多个字段分隔符序列确实被折叠到一个分隔符中,这是字段分隔符的一个特征。OP的问题是他只有一个回声,我的修正2给了他4个回声,引用$r并不能改变这一点。我想你可能在考虑他的下一个问题。引用$r并不能改变它,因为不引用$hh已经破坏了它。所以它无法正确打印字符串。请告诉我们有关您试图解决的问题的更多信息。你提到了大文件。以上是一个练习