我沒有使用 bash 的經驗,我必須更新一個小腳本,以使用通用模式/development/dev/從 JSON 中的所有值中洗掉子字串。我從GetParametersByPath(AWS 服務)得到類似的東西:
{
"Parameters": [
{
"Name": "/development/dev/var1",
"Type": "String",
"Value": "Saanvi Sarkar",
"Version": 1
},
{
"Name": "/development/dev/var2",
"Type": "String",
"Value": "Zhang Wei",
"Version": 1
},
{
"Name": "/development/dev/var3",
"Type": "String",
"Value": "Alejandro Rosalez",
"Version": 1
},
]
}
我想洗掉所有 Name 值的子字串“/development/dev/”。
這就是我目前所擁有的
// parameter_store_path has the value "/development/dev/"
jq_actions=$(echo -e ".Parameters | .[] | [.Name, .Value] | \042\(.[0])=\(.[2])\042 | sub(\042${parameter_store_path}/\042; \042\042)")
// function that returns the JSON
aws ssm get-parameters-by-path \
--path $parameter_store_path \
--with-decryption \
--region eu-west-2 \
| jq -r "$jq_actions" >> /opt/elasticbeanstalk/deployment/custom_env_var
cp /opt/elasticbeanstalk/deployment/custom_env_var /opt/elasticbeanstalk/deployment/env
#Remove temporary working file.
rm -f /opt/elasticbeanstalk/deployment/custom_env_var
#Remove duplicate files upon deployment.
rm -f /opt/elasticbeanstalk/deployment/*.bak
我正在閱讀一些關于 bash 的檔案,我看到我可以使用${FOO#prefix}替換部分字串,但我不知道如何在這段代碼中實作它。
uj5u.com熱心網友回復:
您似乎已經知道如何在jq. 稍微多做一點。
aws ssm get-parameters-by-path \
--path "$parameter_store_path" \
--with-decryption \
--region eu-west-2 |
jq -r '.Parameters | .[] |
"\(.Name | sub("/development/dev/"; ""))=\(.Value)"'
(下標[2]在這里沒有意義 - 我猜你的意思是[1]。但是,無論如何,下標似乎是多余的;我進行了重構以簡化它,并僅在 . 上應用替換。Name也許還在?周圍添加雙引號Value
演示:https ://jqplay.org/s/o7Exg4Ns6BU
如果您想將路徑作為變數傳遞,請嘗試
jq --arg path "/development/dev/" \
-r '.Parameters | .[] |
"\(.Name | sub($path; ""))=\"\(.Value)\""'
演示:https ://replit.com/@tripleee/aws-jq-demo#main.sh
這也擺脫了echo -e. 在這種特殊情況下,我只是切換到單引號而不是雙引號(盡管注意它們做的事情略有不同- 通常更喜歡單引號,除非您需要在字串中執行命令替換或變數替換,或者如果它需要包含文字單引號。Bash 還提供了$'\047C-style\047 strings'與 in 類似的反斜杠解釋工具echo -e- 該示例演示了如何使用八進制轉義嵌入文字單引號\047)。
只有當您已經是 Bash 變數中的字串時,引數擴展才真正有意義。
這是您的腳本的重構,它也避免了奇怪的cp rm有利于簡單的mv. 我猜您在腳本前面的目標檔案中寫入了其他內容,這就是您將這些值從jq.
#!/bin/bash
parameter_store_path="/development/dev/"
aws ssm get-parameters-by-path \
--path "$parameter_store_path" \
--with-decryption \
--region eu-west-2 |
jq --arg path "$parameter_store_path" \
-r '.Parameters | .[] |
"\(.Name | sub($path; ""))=\"\(.Value)\""
' >> /opt/elasticbeanstalk/deployment/custom_env_var
mv /opt/elasticbeanstalk/deployment/custom_env_var /opt/elasticbeanstalk/deployment/env
rm -f /opt/elasticbeanstalk/deployment/*.bak
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/524809.html
標籤:重击
下一篇:如何過濾和排序JQ提取的資料?
