You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

多主机名if-then语句在Opsworks部署中触发bash意外文件结束问题排查

Bash脚本"unexpected end of file"错误排查(针对许可证匹配场景)

兄弟,我太懂这种bash脚本卡if语句的糟心感了!你说的这个“unexpected end of file”十有八九是if语句的语法细节没做对,跟if之间要不要加额外内容没关系,核心问题大概率是结构没闭合完整或者符号用错了。结合你4台服务器绑定许可证的场景,我给你捋捋常见坑和解决办法:


最容易踩的坑:if/elif/else的闭合不完整

每个if都必须对应一个fi来收尾,要是漏写了fi,脚本执行到最后就会触发这个错误。比如你可能写了判断主机名的逻辑,但忘了加fi闭合,或者elif/else的数量和if不匹配。举个反例和正例:

# 错误写法(漏了fi)
if [[ $(hostname) == "server1" ]]; then
    cp license1.lic /opt/app/license.lic

# 正确写法
if [[ $(hostname) == "server1" ]]; then
    cp license1.lic /opt/app/license.lic
fi

括号、分号的语法细节错了

[[ ]]做条件判断时,两边必须留空格(比如[[$(hostname)...]]这种没空格的写法会直接报错);另外if后面的条件结束后,要么加; then放在同一行,要么then单独换行,不能直接跟在条件后面:

# 错误写法(无空格+无分号)
if [[$(hostname)=="server1"]]then

# 正确写法二选一
if [[ $(hostname) == "server1" ]]; then
# 或者
if [[ $(hostname) == "server1" ]]
then

Opsworks环境特有的换行/缩进问题

如果你是在Opsworks配方里用 heredoc(比如<<EOF)写脚本,一定要注意:结束的EOF必须单独一行,不能有任何缩进(哪怕是空格或制表符),否则会被当成脚本内容的一部分,导致结构不完整:

# 错误写法(EOF缩进了)
cat > /opt/app/install.sh <<EOF
if [[ ... ]]; then
    ...
fi
    EOF

# 正确写法(EOF顶格)
cat > /opt/app/install.sh <<EOF
if [[ ... ]]; then
    ...
fi
EOF

给你适配场景的完整示例脚本

你可以对照这个改自己的脚本,确保逻辑和语法都没问题:

#!/bin/bash
HOSTNAME=$(hostname)

# 匹配对应服务器的许可证
if [[ "$HOSTNAME" == "server1" ]]; then
    cp /path/to/license1.lic /opt/app/license.lic
    echo "Applied license for server1"
elif [[ "$HOSTNAME" == "server2" ]]; then
    cp /path/to/license2.lic /opt/app/license.lic
    echo "Applied license for server2"
elif [[ "$HOSTNAME" == "server3" ]]; then
    cp /path/to/license3.lic /opt/app/license.lic
    echo "Applied license for server3"
elif [[ "$HOSTNAME" == "server4" ]]; then
    cp /path/to/license4.lic /opt/app/license.lic
    echo "Applied license for server4"
else
    echo "No matching license found for host $HOSTNAME"
    exit 1
fi

最后给你个小技巧:先把脚本单独拿出来,用bash -n your_script.sh做语法检查,这个命令会帮你找出所有语法错误,不用实际执行脚本,非常高效!

内容的提问来源于stack exchange,提问作者acdii

火山引擎 最新活动