多主机名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




