Docker构建服务时Apache报错:pete_install.sh出现end of file unexpected语法错误
问题排查及解决方案
核心错误原因
- 换行符格式不兼容:脚本是在Windows环境下编辑的,默认使用CRLF(\r\n)作为换行标识,Linux系统仅识别LF(\n)换行,行尾残留的
\r字符会被系统识别为命令的一部分,所以触发第2行: not found的报错。 - 条件分支结构不完整:脚本开头第4行的
if [ ! -f "$FILE" ]; then判断没有对应的fi闭合,Shell解析到文件末尾都没有找到匹配的闭合标识,因此触发第110行的语法错误。
修复方案
- 转换换行符格式
你可以任选以下一种方法完成格式转换:- 安装dos2unix工具后执行:
dos2unix /usr/local/bin/pete_install.sh - 用sed命令直接删除行尾的
\r字符:sed -i 's/\r$//' /usr/local/bin/pete_install.sh - 后续在Windows编辑Shell脚本时,提前将编辑器的换行符设置调整为LF格式再保存。
- 安装dos2unix工具后执行:
- 补全条件分支闭合
统计脚本中if关键字的数量,确保和fi关键字的数量完全匹配,开头的未闭合if分支在对应逻辑执行完成后补上fi即可。 - 预检查脚本语法
修复完成后可以先执行静态语法检查,不用实际运行脚本就能验证语法是否正确:bash -n /usr/local/bin/pete_install.sh,如果没有任何输出就说明语法没问题。
额外注意事项
当前脚本中ssh-keygen生成的密钥默认存储在执行用户的家目录路径~/.ssh/id_rsa,后续chmod修改权限的路径是/var/www/.ssh/,需要确认执行脚本的用户家目录是否为/var/www,避免生成的密钥和修改权限的路径不匹配导致后续权限报错。
内容的提问来源于stack exchange,提问作者KatiaSisHost
相关产品推荐
相关产品推荐

