我正在通過 jq 和 json 讀取 aws ssm 引數,并希望在yaml經過一些處理和別名映射后將它們放入檔案中。
我有一個將引數名稱映射到某個內部名稱的關聯陣列(請參閱 process.sh)
我簡化的 example.json 是
{
"Parameters": [
{
"Name": "/dev/applications/web/some_great_key",
"Value": "magicvaluenotrelevant"
},
{
"Name": "/dev/applications/web/api_magic",
"Value": "blabla"
}
]
}
我的 bash 腳本process.sh是
#!/usr/bin/env bash
declare -A ssmMap
ssmMap[/dev/applications/web/some_great_key]=theGreatKEYAlias
ssmMap[/dev/applications/web/api_magic]=apiKey
jq -r '
.Parameters
| map({
Name: .Name,
parameterValue: .Value
})
| map((${!ssmMap[.Name]} ": \"" .parameterValue "\""))
| join("\n")
' < example.json;
我希望/期望輸出是:
ssm_theGreatKEYAlias: "magicvaluenotrelevant"
ssm_apiKey: "singleblabla"
使用我提供的 process.sh 腳本時出現錯誤,因為找不到sshMap在 jq 映射中使用關聯陣列的方法,將引數名稱從 json 轉換為 sshMap 的映射別名。
知道如何實作嗎?
如果我將第 13 行更改process.sh為
| map((.Name ": \"" .parameterValue "\""))
它作業正常,但沒有映射,使用來自 json 檔案的原始引數名稱。
uj5u.com熱心網友回復:
您正在嘗試從 jq 訪問 shell var。
固定的:
ssm_map='
{
"some_great_key": "theGreatKEYAlias",
"api_magic": "apiKey"
}
'
jq -r --argjson ssm_map "$ssm_map" '
.Parameters[] |
"ssm_\( $ssm_map[ .Name ] ): \"\( .Value )\""
'
jqplay上的演示
您可以將您描述的變數轉換為具有不同難度的 JSON(取決于您愿意接受的限制,如果有的話)。但是由于您是從 的輸出構建變數yq,應該可以簡單地讓它直接輸出 JSON。
uj5u.com熱心網友回復:
如果您的實際任務是從 YAML 轉換并作為 JSON 處理,那么使用mikefarah/yq或kislyuk/yq或itchyny/gojq絕對是更好的方法。
但是,要完成您在原始問題中描述的任務,可以使用選項添加 bash 關聯陣列的鍵和值,并通過陣列--args在其中訪問它們(需要1.6 版),然后通過ing 兩半恢復關聯該陣列,并使用前半部分的鍵創建一個,然后可以使用它來創建所需的文本行,這些文本行使用該選項作為原始文本輸出。jq$ARGS.positionaljqtransposeINDEXJOIN-r
jq -r '
JOIN(
$ARGS.positional | [.[:length/2], .[length/2:]] | transpose | INDEX(.[0]);
.Parameters[];
.Name;
"ssm_\(.[1][1] // .[0].Name): \(.[0].Value)"
)
' example.json --args "${!ssmMap[@]}" "${ssmMap[@]}"
ssm_theGreatKEYAlias: magicvaluenotrelevant
ssm_apiKey: blabla
示例檔案不需要回退// .[0].Name,但添加后使用原始鍵以防 bash 陣列未涵蓋輸入鍵。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465461.html
上一篇:命令替換到管道中
