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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:42:22