Auto Scaling绑定EIP脚本报错:unexpected end of file 求助
问题描述
希望将Elastic IP(EIP)与Auto Scaling Group关联,让Auto Scaling触发时自动为新实例绑定EIP。现有2台服务器对应2个EIP,因此在用户数据中添加了脚本,逻辑是检查EIP是否空闲,空闲则绑定到当前实例。但执行脚本时出现报错:line 19: syntax error: unexpected end of file,已检查缩进未发现问题,原脚本如下:
#!/bin/bash INSTANCE_ID=$(ec2-metadata --instance-id | cut -d " " -f 2); EIP_LIST=(eipalloc-07da69856432f7cef eipalloc-0355263fcb50412ed) for EIP in $${EIP_LIST}; do echo"Checkin if EIP is free" ISFREE=$(aws ec2 describe-addresses --allocation-ids $EIP --query Addresses[].InstanceID --output text --region ap-south-1) STARTWAIT=$(date +%s) while [ ! -z "$ISFREE" ]; do if [ "$(($(date +%s) - $STARTWAIT))" -gt $MAXWAIT ]; then echo "WARNING: We waited for 30 seconds, we are forcing it now." ISFREE="" else echo "checking the other EIP [$EIP]" ISFREE=$(aws ec2 describe-adresses --allocation-ids $EIP --query Addresses[].InstanceID --output text --region ap-south-1) fi done echo "Running: aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $EIP --allow-reassociation --region ap-south-1" aws ec2 association-address --instance-id $INSTANCE_ID --allocation-id $EIP --allow-reassociation --region ap-south-1
问题分析与修复
报错unexpected end of file的核心原因是脚本结构不完整,同时存在多处语法和拼写错误,逐一修复如下:
- 数组遍历逻辑错误:原脚本
for EIP in $${EIP_LIST}; do无法正确遍历数组元素,应改为for EIP in "${EIP_LIST[@]}"; do,[@]用于遍历数组所有元素,引号可避免元素含空格时出现解析错误。 - 未初始化变量:脚本中使用了
$MAXWAIT但未定义,需添加MAXWAIT=30(对应当前逻辑中的30秒等待时长)。 - AWS命令拼写错误:
describe-adresses应为describe-addresses(缺少字母d)association-address应为associate-address(动词形式拼写错误)
- 脚本结构不完整:原脚本缺少
done语句结束for循环,这是触发"unexpected end of file"的直接原因。 - echo命令格式错误:
echo"Checkin if EIP is free"缺少空格,且单词拼写有误,应改为echo "Checking if EIP is free"。
修复后的完整脚本
#!/bin/bash INSTANCE_ID=$(ec2-metadata --instance-id | cut -d " " -f 2) MAXWAIT=30 EIP_LIST=(eipalloc-07da69856432f7cef eipalloc-0355263fcb50412ed) for EIP in "${EIP_LIST[@]}"; do echo "Checking if EIP is free" ISFREE=$(aws ec2 describe-addresses --allocation-ids "$EIP" --query Addresses[].InstanceID --output text --region ap-south-1) STARTWAIT=$(date +%s) while [ ! -z "$ISFREE" ]; do if [ "$(($(date +%s) - $STARTWAIT))" -gt "$MAXWAIT" ]; then echo "WARNING: We waited for 30 seconds, we are forcing it now." ISFREE="" else echo "Checking EIP [$EIP] status" ISFREE=$(aws ec2 describe-addresses --allocation-ids "$EIP" --query Addresses[].InstanceID --output text --region ap-south-1) sleep 2 # 添加短延迟,避免频繁调用API触发限流 fi done echo "Running: aws ec2 associate-address --instance-id $INSTANCE_ID --allocation-id $EIP --allow-reassociation --region ap-south-1" aws ec2 associate-address --instance-id "$INSTANCE_ID" --allocation-id "$EIP" --allow-reassociation --region ap-south-1 done
额外优化:给变量添加引号避免特殊字符解析问题,添加sleep 2减少AWS API调用频率,降低触发限流的风险。
内容的提问来源于stack exchange,提问作者Aravind
相关产品推荐
相关产品推荐

