[英]exporting environment variables with spaces using jq
因此,我正在尝试导出来自返回json值的api的环境变量。 想要使用jq只做一个衬板,但是如果值中有空格,我将无法使其正常工作
尝试不用引号引起来的值
/app/src $ $(echo '{"params":[{ "Name":"KEY","Value":"value with space"}]}' | jq
-r '.params[] | "export " + .Name + "=" + .Value')
/app/src $ printenv KEY
value
/app/src $
接下来,我尝试将值包装在引号中
/app/src $ $(echo '{"params":[{ "Name":"KEY","Value":"value with space"}]}' | jq
-r '.params[] | "export " + .Name + "=\"" + .Value + "\""')
sh: export: space": bad variable name
/app/src $
对于以下所有内容,我假设是:
json='{"params":[{ "Name":"KEY","Value":"value with space"}]}'
eval
来完成,但前提是您信任自己的输入 。 可能看起来像:
eval "$(jq -r '.params[] | "export \(.Name | @sh)=\(.Value | @sh)"' <<<"$json")"
jq
内置的@sh
在bash @sh
内容转义为eval
-safe,然后eval
调用可确保内容经过所有解析阶段(因此jq
发出的数据中的文字引号变为语法)。
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
如果已知值不包含(原始)换行符,并且您有权访问mapfile
,则值得考虑使用它,例如
$ json='{"params":[{ "Name":"KEY","Value":"value with space"}]}'
$ mapfile -t KEY < <( jq -r '.params[] | .Value' <<< "$json" )
$ echo N=${#KEY[@]}
N=1
如果这些值可能包含(原始)换行符,那么您需要一个带有-d选项的mapfile
版本,该版本可以如下所示使用:
$ json='{"params":[{ "Name":"KEY1","Value":"value with space"}, { "Name":"KEY2","Value":"value with \n newline"}]}'
$ mapfile -d $'\0' KEY < <( jq -r -j '.params[] | .Value + "\u0000"' <<< "$json" )
$ echo N=${#KEY[@]}
N=2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.