使用`for`循环逐行读取

时间:2014-01-22 10:12:33

标签: 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

5 个答案:

答案 0 :(得分:4)

使用while循环:

$ while read -r r; do echo $r; done <<< "$hh"

1
2
3
4

答案 1 :(得分:2)

正确的答案是,你逐行读取for循环。使用while循环代替内置read

while IFS= read -r line; do
    echo "$line"
done <<< "$hh"

答案 2 :(得分:0)

虽然使用while read肯定可以解决这个问题,但如果你真的想使用for loop,那么你需要使用IFS=$'\n'来读取bash's for loop中的输入字符串:

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'

答案 3 :(得分:0)

$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

答案 4 :(得分:-1)

这只是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