Bash

/bin/aws 的參數列表太長

  • March 22, 2017

我正在編寫一個腳本,該腳本將遍歷這樣設置的文本文件:

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 並不是一個很好的文件處理工具……

引用自:https://unix.stackexchange.com/questions/353111