You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:31:01