我有env.json具有以下內容的 json 檔案:
{
"parameters": {
"name": "www",
"dev" : "",
"prod": ""
}
}
dev現在我想prod通過 bash 腳本使用jq. 這是代碼:
ENVJSON=$(cat env.json)
jq '.parameters.name = $val' --arg val $NAME <<<"$ENVJSON" > env.json
jq '.parameters.prod = $val' --arg val $PROD <<<"$ENVJSON" > env.json
jq '.parameters.dev = $val' --arg val $DEV <<<"$ENVJSON" > env.json
當我運行它時,我將 $NAME 和 $DEV 的值正確注入到 JSON 檔案中。但是 $PROD 值不會為prod索引注入。它保持為空。看起來這是中間線的問題。
如果我交換最后兩行,那么是的,中間行不起作用。
這里有什么問題?
我還嘗試&& sleep 1在每個命令的末尾附加jq,沒有運氣。
uj5u.com熱心網友回復:
您可以進行多值替換,jq以防止一次又一次地覆寫同一個檔案。
#!/usr/bin/bash
NAME=name
DEV=dev
PROD=prod
echo -e "$(jq --arg name $NAME --arg dev $DEV --arg prod $PROD '.parameters.name = ($name) | .parameters.dev = ($dev) | .parameters.prod = ($prod)' env.json)" > env.json
uj5u.com熱心網友回復:
問題是,最后一次使用的jq是原始的,env.json而不是由jq. 我們可以通過只呼叫一次來解決這個問題jq(作為獎勵獲得性能提升)。
ENVJSON="$( cat env.json )"
jq \
--arg name "$NAME" \
--arg prod "$PROD" \
--arg dev "$DEV" \
'
.parameters.name = $name |
.parameters.prod = $prod |
.parameters.dev = $dev
' <<<"$ENVJSON" >env.json
如果變數被匯出,我們甚至可以使用
jq '
.parameters.name = env.name |
.parameters.prod = env.prod |
.parameters.dev = env.dev
'
順便說一句,sponge非常適合從同一個檔案中讀取和寫入。
jq '...' env.json | sponge env.json
uj5u.com熱心網友回復:
如果檔案從不更改,則不需要從檔案中讀取 JSON 模板。該模板包含在采用or的jq過濾器腳本中,因此可以直接將其寫入輸出檔案,而無需保存到中間臨時檔案。--null-input-n
NAME='www foo' PROD='prod bar thing' DEV='stuff for dev baz'
jq -n --arg name "$NAME" --arg prod "$PROD" --arg dev "$DEV" \
'{"parameters":{"name":$name,"dev":$dev,"prod":$prod}}' > env.json
cat env.json:
{
"parameters": {
"name": "www foo",
"dev": "stuff for dev baz",
"prod": "prod bar thing"
}
}
uj5u.com熱心網友回復:
其他答案很好,但我犯了一個愚蠢的錯誤,我想指出。在這些命令中,
ENVJSON=$(cat env.json)
jq '.parameters.name = $val' --arg val $NAME <<<"$ENVJSON" > env.json
jq '.parameters.prod = $val' --arg val $PROD <<<"$ENVJSON" > env.json
jq '.parameters.dev = $val' --arg val $DEV <<<"$ENVJSON" > env.json
我在每個命令中都使用了相同的輸入,而不是更新后的輸入。所以我把它改成:
jq '.parameters.name = $val' --arg val $NAME <<<"$(cat env.json)" > env.json
jq '.parameters.prod = $val' --arg val $PROD <<<"$(cat env.json)" > env.json
jq '.parameters.dev = $val' --arg val $DEV <<<"$(cat env.json)" > env.json
它奏效了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422231.html
標籤:
