gpt4 book ai didi

arrays - JSON 列表(不是对象)到 Bash 数组?

转载 作者:太空宇宙 更新时间:2023-11-04 09:17:12 25 4
gpt4 key购买 nike

我有一个 JSON 列表(包含项目列表的键值对的值):

[“约翰”、“鲍里斯”、“乔”、“弗兰克”]

我如何将其转换为 bash 数组,以便我可以遍历它们?

最佳答案

简单案例:无换行的字符串

简单的方法是使用 jq 将您的列表转换为每项一行,并将其读入您的脚本:

json='[ "john", "boris", "joe", "frank" ]'
readarray -t your_array < <(jq -r '.[]' <<<"$json")
declare -p your_array

...正确发出:

declare -a your_array=([0]="john" [1]="boris" [2]="joe" [3]="frank")

棘手的案例:带换行符的字符串

有时您需要读取可以包含换行符的字符串(或者希望避免因恶意或格式错误的数据被读入错误的字段而导致的安全风险)。为避免这种情况,您可以在数据之间使用 NUL 分隔符(并删除其中包含的任何 NUL 值):

json='[ "john\ndoe", "marco\nquent", "malicious\u0000data" ]'

array=( )
while IFS= read -r -d '' item; do
array+=( "$item" )
done < <(jq -j '.[] | ((. | sub("\u0000"; "<NUL>")) + "\u0000")' <<<"$json")

declare -p array

...正确发出:

declare -a array=([0]=$'john\ndoe' [1]=$'marco\nquent' [2]="malicious<NUL>data")

...并且 printf '<%s>\n\n' "${array[@]}" 正确发出:

<john
doe>

<marco
quent>

<malicious<NUL>data>

(请注意,非常新的 bash 有 readarray -0 ,这可以避免需要上面给出的 while IFS= read -r -d '' 循环,但这并不常见。另请注意,您可以使用该循环直接迭代 jq 中的内容,避免需要首先将内容存储在数组中;参见 BashFAQ #1)。

关于arrays - JSON 列表(不是对象)到 Bash 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45991208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com