我正面臨以下命令的問題。我需要使用變數,但它卻回傳空值,而當我硬編碼它的值時,它卻回傳正確的回應。 誰能幫助我,這個命令的正確寫法是什么? 我的目的是要拉出作為變數傳遞的相應鍵的值。
temp1="{ "SSM_DEV_SECRET_KEY": "Smkfnkhnb48dh", "SSM_DEV_GRAPH_DB": "Prod=bolt://neo4j:[email protected]:7687", "SSM_DEV_RDS_DB": "sqlite:////var/local/ecosystem_dashboard/config.db", "SSM_DEV_SUPPERUSER_USERNAME": "admin", "SSM_DEV_SUPPERUSER_PASSWORD": "9dW6JE8@KH9qiO006" }"
var_name=SSM_DEV_SECRET_KEY
echo $temp1 | jq -r '.SSM_DEV_SECRET_KEY'/span> <----- return Smkfnkhnb48dh // output
echo $temp1 | jq -r '。"$var_name"' <---- return null
echo $temp1 | jq -r -arg var_name "$var_name"/span> '. "$var_name"' <---- return null , alternative way
更新:我正在添加我試圖使用上述修復方法的實際部分。我的意圖是首先讀取所有以SSM_DEV_...開頭的值,然后從aws獲取其原始值,再將其替換進來。
修復:我已經解決了我的問題,就是回車符的問題。
以下是幫助我的cmd:
uj5u.com熱心網友回復: 你需要使用通用物件索引( 該命令應該看起來像: 它將輸出: 注意: uj5u.com熱心網友回復: 讓我們來看看下面的陳述句: 你的問題實際上是關于shell的引號,而不是temp0="dev"/span>
temp1="DEV"/span>
result1=$(aws secretsmanager get-secret-value --secret-id "xxx-secret-$temp0" | jq ' .SecretString')
while IFS= read -r line; do
if [[ "$line" == *"=$SSM_$temp1"]]。then
before=${line%%"="*}>
after=${line#*"="}
var_name="${after:1}"
jq -r --arg var_name "$var_name" ' 。 [$var_name]' <<< "$result1"。
fi
done < sample_file.txt
var_name=`echo ${after:1} | tr -d '
'`
jq -r --arg var_name "$var_name" ' 。 [$var_name]' <<< "$result1"。
.[$var_name])來讓jq知道該變數應該被視為一個關鍵jq -r --arg var_name "$var_name" '. [$var_name]' <<< "$temp1"
Smkfnkhnb48dh
<<<"$temp1"代替echoecho $temp1 | jq -r ' 。 "$var_name"' <---- return null
jq。 單引號告訴shell不要進行插值(做變數替換)以及其他事情(比如轉義空白和防止球化)。 因此,jq接收的是字面上的."$var_name "作為它的腳本 - 這不是你想要的。 你只需要去掉單引號就可以了:
echo $temp1| jq -r . "$var_name" <---- 這是否可行?
這就是說,我絕不會這樣寫我的腳本。 我肯定會希望在引號字串中包含'.',就像這樣:
我不會這樣寫腳本。
echo $temp1 | jq -r " 。 $var_name" <---- 這是否可行?
有人還建議你把"$temp1 "也加上引號(通常所有的變數參考都應該加上引號,以防止空白,但這不是echo的問題):
echo "$temp1"/span> | jq -r "。 $var_name" <---- 這是否可行?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/309909.html
標籤:
