我正在编写一个脚本,该脚本将循环遍历设置如下的文本文件:
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 并不是一个很好的文件处理工具......