sudhir
sudhir

Reputation: 309

Bash script to pass variable across functions

I have removed parentheses, but still I was not able to fetch ENV_NODE value in second function scpTAR. Please let me know what is wrong.

set -x  
MASTER_HOSTNAME=`hostname | cut -d . -f1`  
TARGET_ENVIRONMENT = it  
evaluateEnvProp(){  
  if [ ${TARGET_ENVIRONMENT} = it ]; then  
    ENV_NAME=it && ENV_NODE=1cf62108e084   
  fi  
}  

scpTAR() {  
  echo ENV_NODE  
  echo ${ENV_NODE}  
  if [ ENV_NODE = ${MASTER_HOSTNAME} ] ; then  
    echo "scpTAR ENV_NODE = ${MASTER_HOSTNAME} " 
  else   
    "echo 'scpTAR ssh other node than jenkins server ENV_NODE=${MASTER_HOSTNAME}'"    
  fi       
}   

main(){    
  scpTAR    
}    

main

Upvotes: 0

Views: 2902

Answers (2)

tomix86
tomix86

Reputation: 1446

As @cyrus said, variables are global by default. What you did is setting the variables in a subshell:

( ENV_NAME=it && ENV_NODE=xyx && ENV_WLS_DOMAIN=user1 && ENV_NODE_PATH=path )

Because of that, these are gone (not propagated to calling script's environment) once the subshell exists. This is why you do not see their values set in scpTAR function. Remove the parentheses and your code should start working.

Update

Updated version of your code (based on answer by itChi) has another major error. You put spaces around the assignment operator when setting TARGET_ENVIRONMENT = it. This syntax is invalid and as a result TARGET_ENVIRONMENT is not assigned the specified value, thus the condition inside evaluateEnvProp function evaluates to false and ENV_NODE variable is not being set. Removing the spaces should solve the problem. You also did not call evaluateEnvProp as pointed out in update to @itChi's answer.

I'd highly recommend that you start using ShellCheck to verify correctness of your scripts.

Upvotes: 3

itChi
itChi

Reputation: 672

As mentioned, variables are global by default, so if you reference them in your scpTAR function, you will get a return value.

However, as a second method, should you wish, you can reference it like so:

scpTAR $ENV_NAME $ENV_NODE $ENV_WLS_DOMAIN $ENV_NODE_PATH

Then in your scpTAR function reference them as:

echo "$1 $2 $3 $4"
it xyx user1 path

Particularly useful should you wish to run code on another machine, run a remote script, or set your script up to pass variables as arguments from bash.

EDIT:

Sorry if I tread on someone's toes, but here is your answer without subshell:

evalEnvProp(){
 if [ ${TARGET_ENVIRONMENT} = "it" ]; then

 ENV_NAME=it
 ENV_NODE=xyx
 ENV_WLS_DOMAIN=user1
 ENV_NODE_PATH=path
 fi
 }  
scpTAR() {  
  echo $ENV_NODE_PATH
}

main(){  
  evalEnvProp   
  scpTAR   
}  
main

Update2:

#!/bin/bash

set -x
MASTER_HOSTNAME=`hostname | cut -d . -f1`
TARGET_ENVIRONMENT=it
evaluateEnvProp(){
if [ ${TARGET_ENVIRONMENT} = "it" ]; then
ENV_NAME=it && ENV_NODE=1cf62108e084
fi
}

scpTAR() {
echo ENV_NODE
echo ${ENV_NODE}
if [ ENV_NODE == ${MASTER_HOSTNAME} ] ; then
echo "scpTAR ENV_NODE = ${MASTER_HOSTNAME} " else
"echo 'scpTAR ssh other node than jenkins server >ENV_NODE=${MASTER_HOSTNAME}'"

fi

}
main(){
evaluateEnvProp
scpTAR
}
main
  1. MASTER_HOSTNAME needs `` for the command. you are calling hostname. You can also accomplish this with $()
  2. Spacing in the IF statement either side of the = sign. otherwise you are not evaluating, you are setting a variable.
  3. In your edit you missed out a function call to evaluateEnvProp which failed because you didn't set the variable.

Upvotes: 0

Related Questions