Bash 将命令输出拆分为行数组

Bash 将命令输出拆分为行数组,bash,Bash,下面是我的bash函数,它获取命令的输出作为参数,然后返回一个输出行数组 function get_lines { while read -r line; do echo $line done <<< $1 } SESSIONS=`loginctl list-sessions` get_lines "$SESSIONS" 但是while循环只运行一次,在一行中打印所有输出。如何获取行数组并返回它? 这个答案的价值在于解释OP代码的问题。

下面是我的bash函数,它获取命令的输出作为参数,然后返回一个输出行数组

function get_lines { 
    while read -r line; do 
        echo $line
    done <<< $1
}

SESSIONS=`loginctl list-sessions`
get_lines "$SESSIONS"
但是while循环只运行一次,在一行中打印所有输出。如何获取行数组并返回它?

这个答案的价值在于解释OP代码的问题。
-其他答案显示了使用Bash v4+内置
mapfile
(或其有效别名
readarray
)直接逐行将输入读取到数组元素中,而无需自定义shell函数。

-在Bash v3.x中,您可以使用
IFS=$'\n'read-r-d'-a行<您可以使用readarray并避免使用get\u行函数:

readarray SESSIONS < <(loginctl --no-legend list-sessions)

readarray会话<在
bash
v4+中有一种方法:

SESSIONS=`loginctl list-sessions`
mapfile -t myArray <<< "$SESSIONS"
SESSIONS=`loginctl列出会话`

mapfile-t myArray++,但您应该添加
-t
,以免捕获每个输入行的尾部
\n
readarray
需要Bash 4.x。看起来不错。我不明白
<++;值得注意的是,
mapfile
(及其有效别名,
readarray
)需要bash4.x。
get_lines < <(loginctl list-sessions)
loginctl list-sessions | get_lines
readarray SESSIONS < <(loginctl --no-legend list-sessions)
SESSIONS=`loginctl list-sessions`
mapfile -t myArray <<< "$SESSIONS"