Docker执行bash脚本报unexpected "(" (expecting "then")如何修复
运行脚本时报错:
./scripts/proto-generator.sh: line 13: syntax error: unexpected "(" (expecting "then")
报错原因
核心问题是脚本没有指定解释器,Docker环境中执行无shebang的脚本时,默认会调用/bin/sh解释运行。多数轻量基础镜像的/bin/sh是dash或busybox sh,不支持bash专属的[[ ]]条件判断、=~正则匹配语法,解析到第13行正则表达式中的(时无法识别,就会抛出该语法错误。
修复方案
按以下步骤操作即可解决:
- 在脚本第一行添加bash解释器声明(shebang),强制用bash执行脚本:
添加后脚本开头结构如下,其余原有代码无需改动:#!/usr/bin/env bash#!/usr/bin/env bash function printGreen() { printf "\e[0;32m$1\e[0;m\n" } function printRed() { printf "\e[0;31m$1\e[0;m\n" } service=$1 outDir=./src/services/$service/models protoDir=./protos/"${service}Service"/*.proto # 后续原有代码保持不变 - 给脚本添加可执行权限(未配置的话执行以下命令):
chmod +x ./scripts/proto-generator.sh - 确认Docker镜像内预装了bash:
- 普通Debian/Ubuntu基础镜像(比如官方默认node镜像)默认自带bash,无需额外操作
- Alpine基础镜像(比如node:alpine这类轻量镜像)默认不带bash,需要在Dockerfile中添加安装命令:
RUN apk add --no-cache bash
额外排查项
如果完成以上操作后仍报同类语法错误,检查脚本文件的换行符格式:Windows环境下编辑的文件默认使用CRLF换行符,Linux环境下解析会出现异常,将换行符改为Unix标准的LF格式即可,也可以直接在容器内执行dos2unix ./scripts/proto-generator.sh命令一键转换。
内容的提问来源于stack exchange,提问作者retr0327
相关产品推荐
相关产品推荐

