我在復制json?從兩個網站嘗試實作我的目標
https://softwaredevelopmentstuff.com/2017/05/02/downloading-an-aws-glacier-archive-step-by-step/
https://gist.github.com/veuncent/ac21ae8131f24d3971a621fac0d95be5
這有效:
#!/bin/bash
file='/home/nat/Documents/glacier_access/output.json'
if [[ -z ${AWS_ACCOUNT_ID} ]] || [[ -z ${AWS_REGION} ]] || [[ -z ${AWS_VAULT_NAME} ]]; then
echo "Please set the following environment variables: "
echo "AWS_ACCOUNT_ID"
echo "AWS_REGION"
echo "AWS_VAULT_NAME"
exit 1
fi
archive_ids=$(jq .ArchiveList[].ArchiveId < $file)
for archive_id in ${archive_ids}; do
echo "Downloading Archive: ${archive_id}"
aws glacier delete-archive --archive-id=${archive_id} --vault-name ${AWS_VAULT_NAME} --account-id ${AWS_ACCOUNT_ID} --region ${AWS_REGION}
done
就像這樣:
# file to loop action on archives
#!/bin/bash
file='/home/nat/Documents/glacier_access/output.json'
if [[ -z ${AWS_ACCOUNT_ID} ]] || [[ -z ${AWS_REGION} ]] || [[ -z ${AWS_VAULT_NAME} ]]; then
echo "Please set the following environment variables: "
echo "AWS_ACCOUNT_ID"
echo "AWS_REGION"
echo "AWS_VAULT_NAME"
exit 1
fi
archive_ids=$(jq .ArchiveList[].ArchiveId < $file)
for archive_id in ${archive_ids}; do
echo "Downloading Archive: ${archive_id}"
aws glacier initiate-job \
--account-id 510422384120\
--vault-name ebony-backup \
--job-parameters '{
"Type": "archive-retrieval",
"Description": "Download all my archives",
"ArchiveId": "w0GUthLDLDR6NL1z4c53M1IFktxBCrW_qZ2Qm_",
}'
done
但我不能在回圈中參考變數
所以這不起作用:
"ArchiveId": "${archive_id}"
也不是這個:
"ArchiveId": "{archive_id}"
需要注意的重要一點是必須從作業引數部分中參考 ArcihiveID。
感激地收到任何幫助。我假設這是一個 JSON 問題?
uj5u.com熱心網友回復:
您聲稱不能在回圈中使用該變數的說法是錯誤的。您已經使用echo "Downloading Archive: ${archive_id}". 這意味著問題實際上出在回圈的第二個命令上。
具體來說,問題是您構建用作引數的字串--job-parameters。單引號中的所有內容都是準確生成的,因此您生成字串
{
"Type": "archive-retrieval",
"Description": "Download all my archives",
"ArchiveId": "${archive_id}"
}
以下是四種解決方案。
使用雙引號字串從 shell 創建 JSON
--job-parameters "{
\"Type\": \"archive-retrieval\",
\"Description\": \"Download all my archives\",
\"ArchiveId\": \"$archive_id\"
}"
一般來說,我討厭從 shell 腳本生成代碼的方法。然而,在這種情況下它是安全的,因為 id 完全由單詞字符組成。不過,我們最終會得到很多反斜杠。
使用 here-doc 從 shell 創建 JSON
--job-parameters <<EOS
{
"Type": "archive-retrieval",
"Description": "Download all my archives",
"ArchiveId": "$archive_id"
}
EOS
這仍然是從 shell 腳本生成代碼。但是通過使用 here-doc,"不再特殊,因此無需轉義它們。
使用 jq 創建 JSON
--job-parameters "$(
jq -n --arg archive_id "$archive_id" '
{
"Type": "archive-retrieval",
"Description": "Download all my archives",
"ArchiveId": $archive_id
}
'
)"
請注意,這在程式中使用jq變數$archive_id(使用創建--arg)jq,因此沒有引號。jq將為它生成正確的 JSON 字串文字(如果包含特殊字符,則包括它")。
這更干凈,即使 archive_id 包含特殊字符也能正常作業。它有點慢,每次都必須啟動 jq 。
使用 jq 的單個實體創建 JSON
這解決了必須多次啟動 jq 的問題。
jq -c '
.ArchiveList[] |
{
"Type": "archive-retrieval",
"Description": "Download all my archives",
"ArchiveId": .ArchiveId
}
' "$file" |
while read -r job; do
aws glacier initiate-job \
--account-id 510422384120 \
--vault-name ebony-backup \
--job-parameters "$job"
done
請注意,存檔 ID 后不應有逗號。JSON 中不允許使用尾隨逗號。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405250.html
標籤:
