作者:快乐生鹤 | 来源:互联网 | 2022-12-09 19:13
1> Charles Duff..:
对于以下所有,我假设:
json='{"params":[{ "Name":"KEY","Value":"value with space"}]}'
它可以完成eval
,但只有你信任你的输入.
这可能看起来像:
eval "$(jq -r '.params[] | "export \(.Name | @sh)=\(.Value | @sh)"' <<<"$json")"
的@sh
在内置jq
逃逸内容要eval
在bash -safe,并且eval
然后调用确保内容经过所有解析级(在数据所以文字引号由发射jq
成为句法).
更好的形式是生成NUL分隔的键/值列表......
build_kv_nsv() {
jq -j '.params[] |
((.Name | gsub("\u0000"; "")),
"\u0000",
(.Value | gsub("\u0000"; "")),
"\u0000")'
}
...并填充一个关联数组......
declare -A content_received=( )
while IFS= read -r -d '' name && IFS= read -r -d '' value; do
content_received[$name]=$value
done <<(build_kv_nsv <<<"$json")
# print the value of the populated associative array
declare -p content_received
...或者使用带有前缀的命名空间来保证安全.
while IFS= read -r -d '' name && IFS= read -r -d '' value; do
printf -v "received_$name" %s "$value" && export "received_$name"
done <<(build_kv_nsv <<<"$json")
# print names and values of our variables that start with received_
declare -p "${!received_@}" >&2