BASH-将数组字符串转换为数组

时间:2019-11-18 19:40:16

标签: bash shell

我得到以下字符串,并且试图将其转换为数组。

[ "aaa", "bbb" ]

有人可以让我知道是否可以将其转换为BASH数组。

1 个答案:

答案 0 :(得分:0)

您可以使用jq提取单个字符串,然后逐行读取它们:

myJsonArray='[ "aaa", "bbb", "more \"complex\"\u0020value" ]'
mapfile -t myBashArray < <(jq -r '.[]' <<< "$myJsonArray")
declare -p myBashArray

这将输出declare -a myBashArray=([0]="aaa" [1]="bbb" [2]="more \"complex\" value")

如果您还想支持带有换行符的元素,则可以使jq输出NUL分隔的值,并且需要做更多的工作:

myJsonArray='[ "multi\nline\ndata", "hostile'\''\"\u0000\n$(rm foo)data" ]'
array=()
while IFS= read -r -d '' line
do
  array+=("$line")
done < <(jq -j '(.[] | gsub("\u0000"; "")) + "\u0000"' <<< "$myJsonArray")

declare -p array

这将输出declare -a array=([0]=$'multi\nline\ndata' [1]=$'hostile\'"\n$(rm foo)data')

它确保数据中的NUL字节不会受到干扰,但是会将它们从输出中剥离。这不太重要,因为Bash变量首先不能表示NUL字节。