簡體   English   中英

使用jq導出帶有空格的環境變量

[英]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發出的數據中的文字引號變為語法)。


更好的形式是生成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

如果已知值不包含(原始)換行符,並且您有權訪問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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM