Bash
/bin/aws 的參數列表太長
我正在編寫一個腳本,該腳本將遍歷這樣設置的文本文件:
snap-foo bar 20170202
該文本文件基本上包含快照 ID、我們用來辨識關聯實例的標籤以及在 AWS 中創建快照時的時間戳。我幾乎完成了我的腳本,但在處理它的最後一點時我不斷收到錯誤:
#!/bin/bash THIRTY_DAYS_AGO=$(date --date '30 days ago' "+%Y%m%d") FILE=/home/rkahil/sorted_snaps.txt for a in $FILE do SNAP_ID=`awk {'print $1'} "$FILE"` FORMAT_FILE=`sed -i 's/T.*//' "$FILE"` TIMESTAMP_SNAPS=`cat "$FILE" | awk {'print $3'}` if [[ "$FORMATTED_DATE" -lt "$THIRTY_DAYS_AGO" ]]; then aws ec2 delete-snapshot --dry-run "$SNAP_ID" #Where the error is fi done
我得到的錯誤是:
./removeOldSnapShots.sh: line 13: /usr/bin/aws: Argument list too long
有人能告訴我這樣做的正確方法是什麼嗎?
您不是在循環文件的內容,而是一次性處理其所有內容;所以特別是,
SNAP_ID
最終包含所有第一列,這顯然太多了,無法在單個命令中使用。您需要使用類似的東西逐行處理文件
< "$FILE" while read SNAP_ID _ TIMESTAMP_SNAPS; do if ... done
使用 時有許多注意事項
read
,與正在讀取的內容(特殊字元、反斜杠等)的影響有關,如果您想更普遍地應用此技術,您可能需要閱讀這些內容。shell 並不是一個很好的文件處理工具……