/bin/aws 的参数列表太长

/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

有人可以告诉我执行此操作的正确方法是什么吗?

答案1

您不是循环遍历文件的内容,而是一次性处理其所有内容;因此,特别是,SNAP_ID最终包含所有第一列,这显然太多而无法在单个命令中使用。

您需要使用类似的方法逐行处理文件

< "$FILE" while read SNAP_ID _ TIMESTAMP_SNAPS; do
    if ...
done

使用 时有许多read与正在读取的内容(特殊字符、反斜杠等)的影响相关的注意事项,如果您想更广泛地应用此技术,您可能需要阅读这些注意事项。 shell 并不是一个很好的文件处理工具......

相关内容