Docker bash:语法错误:意外的“(”(期望“then”)

ret*_*327 0 bash docker dockerfile

我尝试在 Docker 中运行 bash 脚本,但不断收到此错误:

./scripts/proto-generator.sh:第 13 行:语法错误:意外的“(”(期望“then”)

这是我的 proto-generator.sh 文件:

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

if ! [[ "$service" =~ ^(file|user)$ ]]; then
    printRed "Incorrect service: $service"
    exit 1
fi

./node_modules/.bin/proto-loader-gen-types \
    --longs=String \
    --enums=String \
    --defaults \
    --oneofs \
    --grpcLib=@grpc/grpc-js \
    --outDir=$outDir \
    $protoDir

printGreen "GRPC codes generated: ${outDir}"

Run Code Online (Sandbox Code Playgroud)

如何修复语法错误?

谢谢你的帮助!!

Tim*_*mor 5

我很想以评论的形式提出这个问题,但目前还不允许我这样做。无论如何,经过快速测试后,我假设您的 docker 镜像是基于 Alpine Linux 的。标准的 Alpine Linux docker 镜像并不像您所期望的那样附带 bash,而是带有ash,并且 ash 没有[[内置命令,即您应该坚持使用标准[akatest命令,或者完全不使用它。而且,遗憾的是,test它没有处理正则表达式的能力。

也就是说,再次假设您不想用完整的 bash 来使 Alpine 图像膨胀,grep那么就可以解决这个问题。您的情况的解决方案是(第 13 行,ff.)

if ! echo $service | grep -qE "^(file|user)$" ; then
    printRed "Incorrect service: $service"
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

解释

使用您的模式直接测试if返回代码grepgrep如果没有匹配则返回非零,否则返回 0。-q抑制匹配的输出,-E根据需要切换到扩展正则表达式|