在shell脚本中的第一行之后读取后,读取多行输出会停止

时间:2018-03-01 10:29:20

标签: linux shell

IFS="\n"
for line in $text; do 
    read -a array <<< $line
    echo ${array[0]}
done

$ text的内容:

123 456
abc def
hello world

预期结果:

123
456
abc
def
hello
world

真实结果:

123

我怀疑读取-a是停止for循环的那个! 我怎么能解决这个问题?

2 个答案:

答案 0 :(得分:1)

您不需要将IFS修改为新的行字符,然后使用for循环遍历行。只需使用read命令从字符串中读取。

您可以使用单独的占位符变量来存储行中的每一行,而不是将整行读取到数组中。假设shell是像bash这样的非POSIX shell,因为本机POSIX sh shell不支持数组。

#!/usr/bin/env bash

text='123 456
abc def
hello world'

declare -a arrayStorage
while read -r row1 row2; do
    arrayStorage+=( "$row1" )  
    arrayStorage+=( "$row2" )  
done <<< "$text"  

并使用下面的printf打印数组应该根据需要生成输出。

printf '%s\n' "${arrayStorage[@]}"

如果text是正在运行的命令的输出,请在命令上使用进程替换语法,如下所示。这样,命令的输出连接到read命令的标准输入

done < <(somecommand)

或者如果内容只是一个文件,请使用文件重定向来篡改其内容

done < filename

答案 1 :(得分:0)

给出零(0)的内部请给出变量名称

for line in $text; do 
    read -a array <<< $line
    echo ${array[index]}
done