Home > Enterprise >  Docker bash: syntax error: unexpected "(" (expecting "then")
Docker bash: syntax error: unexpected "(" (expecting "then")

Time:06-20

I try to run bash scripts in Docker, buit I keep getting this error:

./scripts/proto-generator.sh: line 13: syntax error: unexpected "(" (expecting "then")

Here's my proto-generator.sh file:

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}"

How can I fix the syntax error?

Thanks for any help!!

CodePudding user response:

I would have loved to ask that question as a comment, but I'm not allowed to, yet. Anyway, after having had a quick test, I assume your docker image is Alpine Linux-based. The standard Alpine Linux docker images do not come with a bash as you might be expecting but with an ash and ash does not have a [[-built in command, i.e. you should be sticking to the standard [ aka test command or get goind completely without it. And, sadly enough, test does not have the ability to handle regular expressions.

That said and again assuming that you do not want to bloat the Alpine image with a complete bash, grep comes to the rescue. A solution for your case would be (lines 13, ff.)

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

explanation

Make the if directly test the return code from grep using your pattern. grep returns non-zero if there was no match, 0 otherwise. -q suppresses output of the match, -E switches to extended regular expression, as needed for the |.

CodePudding user response:

Just put a

#!/bin/bash

at the top of the script

I think you are executing it in /bin/sh, and sh doesn't support bash regex. Or you are using an outdated version of bash, regex in bash where introduced recently.

  • Related