Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用'for'循环逐行读取_Bash_Loops_For Loop - Fatal编程技术网

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已经破坏了它。所以它无法正确打印字符串。请告诉我们有关您试图解决的问题的更多信息。你提到了大文件。以上是一个练习