0

Can anyone please tell me why I am getting this unexpected token error? I have tested two very similar versions, and one gives the error (the basic one), but the other does not.

{VAR_2=(1234-1234-1324-1234);VAR_1=(1234-1234-1324-1234);} > /dev/null 2>&1 && echo "${VAR_1[*]}" && echo "${VAR_2[*]}"

gives:

$ . ./tf-test1.sh
: command not found
1234-1234-1324-1234
1234-1234-1324-1234

Whereas

{
  VAR_ARMCLIENTID=(1234-1234-1324-1234);
  VAR_ARMCLIENTSECRET=('>#bOtp)#M@?<');
  VAR_ARMSUBSCRIPTIONID=(1234-1234-1324-1234);
  VAR_ARMTENANTID=(11234-1234-1324-1234);
  VAR_ARRAYTOLOAD="";
  VAR_SPMGNBSORGID=($(SPMGNBSORGID));
  VAR_SPMGNBSORGSECRET=($(SPMGNBSORGSECRET));
  VAR_TERRAFORM_ENVIRONMENT=($(TERRAFORM_ENVIRONMENT));
  VAR_TERRAFORM_LOCATION=($(TERRAFORM_LOCATION));
} > /dev/null 2>&1

gives:

$ . ./tf-test.sh
: command not found
: command not found
: command not found
: command not found
: command not found
: command not found
: command not found
SPMGNBSORGID: command not found
: command not found
SPMGNBSORGSECRET: command not found
: command not found
TERRAFORM_ENVIRONMENT: command not found
: command not found
TERRAFORM_LOCATION: command not found
: command not found
-bash: ./tf-test.sh: line 13: syntax error near unexpected token `}'
'bash: ./tf-test.sh: line 13: `} > /dev/null 2>&1

Just bear in mind that the $(something) "command" is a pipeline variable that gets replaced by Azure DevOps as it runs the task. I've populated some of the fields just to test it out, and some are not, because that's how AzDO works. If there's no value, it writes the variable name as is (I hate this, but..) This is linked to my previous question here; Output command to null

Here is my full script that I've been messing about with

#!/bin/bash

{
  VAR_ARMCLIENTID=(1234-1234-1324-1234);
  VAR_ARMCLIENTSECRET=('>#bOtp)#M@?<');
  VAR_ARMSUBSCRIPTIONID=(1234-1234-1324-1234);
  VAR_ARMTENANTID=(11234-1234-1324-1234);
  VAR_ARRAYTOLOAD="";
  VAR_SPMGNBSORGID=($(SPMGNBSORGID));
  VAR_SPMGNBSORGSECRET=($(SPMGNBSORGSECRET));
  VAR_TERRAFORM_ENVIRONMENT=($(TERRAFORM_ENVIRONMENT));
  VAR_TERRAFORM_LOCATION=($(TERRAFORM_LOCATION));
} > /dev/null 2>&1

pwd
echo "Loading vars into pipeline..."

if [ "$VAR_ARRAYTOLOAD" != "" ]; then
  echo "Need to load $VAR_ARRAYTOLOAD array"
fi


IFS=' '
ARMarray=()
case "$VAR_ARRAYTOLOAD" in
  "rbac") read -ra ARRAY1 <<< "ARM_CLIENT_ID=${VAR_SPMGNBSORGID[*]} ARM_CLIENT_SECRET=${VAR_SPMGNBSORGSECRET[*]} ARM_SUBSCRIPTION_ID=${VAR_ARMSUBSCRIPTIONID[*]} ARM_TENANT_ID=${VAR_ARMTENANTID[*]} ARM_ENVIRONMENT=${VAR_TERRAFORM_ENVIRONMENT[*]} ARM_LOCATION=${VAR_TERRAFORM_LOCATION[*]}"
    echo "loading vars for RBAC"
    ;;
  "msi") read -ra ARRAY1 <<< "ARM_SUBSCRIPTION_ID=${VAR_ARMSUBSCRIPTIONID[*]} ARM_TENANT_ID=${VAR_ARMTENANTID[*]} ARM_ENVIRONMENT=${VAR_TERRAFORM_ENVIRONMENT[*]} ARM_LOCATION=${VAR_TERRAFORM_LOCATION[*]}"
    echo "loading vars for MSI"
    ;;
  *) read -ra ARRAY1 <<< "ARM_CLIENT_ID=${VAR_ARMCLIENTID[*]} ARM_CLIENT_SECRET=${VAR_ARMCLIENTSECRET[*]} ARM_SUBSCRIPTION_ID=${VAR_ARMSUBSCRIPTIONID[*]} ARM_TENANT_ID=${VAR_ARMTENANTID[*]} ARM_ENVIRONMENT=${VAR_TERRAFORM_ENVIRONMENT[*]} ARM_LOCATION=${VAR_TERRAFORM_LOCATION[*]}"
    echo "loading default vars"
    ;;
esac

for i in "${ARRAY1[@]}"; do
  echo "-var='$i'"
  ARMarray+=("-var='$i'")
done
echo "##vso[task.setvariable variable=TFARMarray;]${ARMarray[*]}"
echo "Combined ARM array output: ${ARMarray[*]}"


IFS=' '
VARarray=()
read -ra ARRAY2 <<< "${VAR_TFarray[*]}"
for i in "${ARRAY2[@]}"; do
  echo "-var='$i'"
  VARarray+=("-var='$i'")
done
echo "##vso[task.setvariable variable=TFarray;]${VARarray[*]}"
echo "Combined TF VAR array output: ${VARarray[*]}"


IFS=' '
TFVARSarray=()
read -ra ARRAY3 <<< "${VAR_TFtfvars[*]}"
for i in "${ARRAY3[@]}"; do
  echo "-var-file=\"$SYSTEM_DEFAULTWORKINGDIRECTORY/$i\""
  TFVARSarray+=("-var-file=\"$SYSTEM_DEFAULTWORKINGDIRECTORY/$i\"")
done
echo "##vso[task.setvariable variable=TFtfvars;]${TFVARSarray[*]}"
echo "Combined TF TFVARS output: ${TFVARSarray[*]}"
Beefcake
  • 733
  • 2
  • 12
  • 37
  • `VAR_SPMGNBSORGID=($(SPMGNBSORGID));` will try to run the command `SPMGNBSORGID`, maybe you mean `VAR_SPMGNBSORGID=($SPMGNBSORGID);` – yolenoyer Oct 23 '20 at 08:53
  • Sadly, I do not. This is how "pipeline variables" get populated within inline scripts for Azure DevOps; https://learn.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#runtime-expression-syntax – Beefcake Oct 23 '20 at 08:55
  • If you run script as a file you can't use syntax `$(something)`. You should rely on env variables and all variables becomes env variables. So `$(something)` becomes `$SOMETHING`. You have this also in the link which you gave `System and user-defined variables also get injected as environment variables for your platform. When variables are turned into environment variables, variable names become uppercase, and periods turn into underscores. For example, the variable name any.variable becomes the variable name $ANY_VARIABLE.` – Krzysztof Madej Oct 23 '20 at 09:01
  • 1
    Those error messages make me think your script may have [DOS/Windows line endings](https://stackoverflow.com/questions/39527571/are-shell-scripts-sensitive-to-encoding-and-line-endings). – Gordon Davisson Oct 23 '20 at 09:14
  • @GordonDavisson; you are right! I am running WSL and VSCode was set to CRLF instead of LF. My god.. thanks for that. You want to raise that as a suggested fix so i can mark it? – Beefcake Oct 23 '20 at 09:27
  • @KrzysztofMadej with regards to your EnvVars thing, you are right, and it got me thinking. The values come from a keyvault task, which sadly doesn't take the value in directly as an EnvVars, I actually need to pass in environment vars by specifying a map (https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/command-line?view=azure-devops&tabs=yaml). Now my pipeline works without any issues messing up the characters that get passed in, thanks for the tip! – Beefcake Oct 23 '20 at 09:54
  • Yeah. All values coming from Key Vault are considered as secrets and thus mapping is necessary. – Krzysztof Madej Oct 23 '20 at 10:00

0 Answers0