Bash脚本在函数之间传递变量

时间:2018-01-03 08:43:47

标签: bash

我删除了括号,但仍然无法在第二个函数<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="tagContainer"> <a class="a1" onmouseover="mouseoverbox1(this)">Color</a> <a class="a1" onmouseover="mouseoverbox1(this)">Names</a> <a class="a1" onmouseover="mouseoverbox1(this)">Places</a> </div>中获取ENV_NODE值。请告诉我有什么问题。

scpTAR

2 个答案:

答案 0 :(得分:3)

@cyrus所述,默认情况下变量是全局变量。您所做的是在subshell中设置变量:

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

因此,一旦子shell存在,这些就会消失(不会传播到调用脚本的环境)。这就是为什么你没有在scpTAR函数中看到它们的值设置的原因。删除括号,您的代码应该开始工作。

<强>更新

您的代码的更新版本(基于itChi的答案)有另一个重大错误。设置TARGET_ENVIRONMENT = it时,在赋值运算符周围放置空格。此语法无效,因此TARGET_ENVIRONMENT未分配指定的值,因此evaluateEnvProp函数内的条件计算结果为false,并且未设置ENV_NODE变量。删除空格应该可以解决问题。您也没有按照@ itChi的回复更新中的指示致电evaluateEnvProp

我强烈建议您开始使用ShellCheck来验证脚本的正确性。

答案 1 :(得分:0)

如前所述,默认情况下变量是全局变量,因此如果您在scpTAR函数中引用变量,则会得到返回值。

但是,作为第二种方法,如果您愿意,可以像这样引用它:

scpTAR $ENV_NAME $ENV_NODE $ENV_WLS_DOMAIN $ENV_NODE_PATH

然后在你的scpTAR函数中将它们引用为:

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

如果您希望在另一台计算机上运行代码,运行远程脚本或将脚本设置为从bash传递变量作为参数,则特别有用。

编辑:

对不起,如果我踩到某人的脚趾,但这是你的答案没有子壳:

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需要``命令。你打电话给hostname。您也可以使用$()
  2. 完成此操作
  3. =符号任意一侧的IF语句中的间距。否则你没有评估,你是setting变量。
  4. 在您的编辑中,您错过了evaluateEnvProp的函数调用,但由于您没有设置变量,因此失败了。