我有一個帶有此測驗行的簡單檔案:
[email protected] 31460 147557432
我的目標是作為 json 資料發送。
在我的 while 回圈中,我可以在代碼示例的第二行中回顯變數。
但是,當我嘗試將它們分配給 jsonstring 和 echo 時,不會填充這些值。
我需要做什么才能將這些值傳遞給我的 json 字串?
while read emailvar idvar expirevar; do
echo "$emailvar:$expirevar:$idvar"
jsonstring=$idvar $emailvar $expirevar
echo "$jsonstring"
#jsonstring='{"user_id":"$idvar","email":"$emailvar","custom_attributes":{"Program_Expires_at":"$expirevar"}}'
done < "tempdata.txt"
uj5u.com熱心網友回復:
#!/bin/bash
while read line;
do
line_array=($line)
emailvar=${line_array[0]}
expirevar=${line_array[1]}
idvar=${line_array[2]}
jsonstring='{"user_id": "'$idvar'", "email": "'$emailvar'", "custom_attributes":{"Program_Expires_at": "'$expirevar'"}'
echo $jsonstring
done < 'tempdata.txt'
輸出:

uj5u.com熱心網友回復:
您必須對空格進行轉義以使其成為字串的一部分,而不是創建帶有一些命令前分配的簡單命令。
jsonstring=$idvar\ $emailvar\ $expirevar
更常見的寫成
jsonstring="$idvar $emailvar $expirevar"
在您的注釋分配中,您使用了單引號,以防止引數擴展。您需要使用雙引號,這需要手動轉義內部雙引號。不過,更強大的是使用類似jq為您生成 JSON的工具:它將負責轉義變數中的任何字符以生成有效的 JSON。
jsonstring=$(jq -n \
--arg id "$idvar" \
--arg email "$emailvar" \
--arg expire "$expirevar" \
'{user_id: $id,
email: $email,
custom_attributes: {Program_Expires_at: $expire}}'
)
uj5u.com熱心網友回復:
看來這本質上是 bash 如何處理變數和引數擴展的問題。我相信這里的解決方案基本上是添加一堆雙引號。
雙引號可用于為多個變數啟用引數擴展。對于此 bash 腳本中的 JSON 輸出,我們需要使用嵌套的雙引號。
為了解決這個問題,我們可以:
- 用雙引號 (
") 將值括起來jsonstring - 將值中
jsonstring使用的字串周圍的雙引號轉義為with\
如果您希望$idvar并被$expirevar解釋為數字而不是字串,則不需要在這些值周圍使用轉義雙引號。
例如:
#!/bin/bash
while read emailvar idvar expirevar; do
jsonstring="{\"user_id\":$idvar,\"email\":\"$emailvar\",\"custom_attributes\":{\"Program_Expires_at\":$expirevar}}"
echo "$jsonstring"
done < "tempdata.txt"
示例輸出:
user@pc: bash ./script.sh
{"user_id":31460,"email":"[email protected]","custom_attributes":{"Program_Expires_at":147557432}}
user@pc: bash ./script.sh | jq .
{
"user_id": 31460,
"email": "[email protected]",
"custom_attributes": {
"Program_Expires_at": 147557432
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/383851.html
上一篇:使用sed替換多行
下一篇:將awk中的行逐行提取到檔案
