情况:我必须将命令输出存储在数组中,每一行都是一个元素。这些行可能包含空格,这似乎使一切都变得混乱。
通常我会做类似的事情ARRAY=($(command))
。但是,如果我尝试做类似的事情,ARRAY=($(printf '%s\n' "first line" "second line"))
数组将如下所示
$ for x in "${ARRAY[@]}"; do echo $x; done
first
line
second
line
我找到了一种方法来实现我正在寻找的行为,尽管它有点难看。
$ readarray -t ARRAY < <(printf '%s\n' "first line" "second line")
$ for x in "${ARRAY[@]}"; do echo $x; done
first line
second line
有谁知道更好的方法来做到这一点?我错过了什么吗?
答案1
readarray
/mapfile
是这方法来做到这一点,但是这个功能是在 bash v4 周围添加的,所以如果你使用的系统没有它(macos),你可以用一种更“丑陋”的方式来做到这一点:
IFS=$'\n' array=($(printf '%s\n' "first line" "second line"))
或者以一种更丑陋的方式:
while IFS= read -r line; do
array+=("$line")
done < <(printf '%s\n' "first line" "second line")