如何将变量从Jenkinsfile传递给shell命令

时间:2017-01-08 23:30:46

标签: shell jenkins groovy jenkins-pipeline jenkinsfile

我想在我的Jenkinsfile脚本中使用我正在使用的变量,然后将其值传递给shell脚本执行(作为环境变量或命令行参数)。

但是以下Jenkinsfile

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh 'echo "from shell i=$i"'
}

给出输出:

a
from shell i=
b
from shell i=
c
from shell i=

所需的输出类似于:

a
from shell i=a
b
from shell i=b
c
from shell i=c

知道如何将i的值传递给shell scipt吗?

修改:根据Matt's回答,我现在使用此解决方案:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh "i=${i}; " + 'echo "from shell i=$i"'
}

优点是,我不需要转义shell脚本中的"

3 个答案:

答案 0 :(得分:17)

您的代码使用文字字符串,因此您的Jenkins变量不会在shell命令中进行插值。您需要使用"sh内的字符串中插入变量。 '只会传递一个文字字符串。所以我们需要在这里做一些改变。

第一种方法是将'更改为"

for (i in [ 'a', 'b', 'c' ]) {
  echo i
  sh "echo "from shell i=$i""
}

但是,现在我们需要逃避内部的"

for (i in [ 'a', 'b', 'c' ]) {
  echo i
  sh "echo \"from shell i=$i\""
}

此外,如果一个变量直接附加到字符串上,就像你上面那样($ii=),我们需要用一些大括号将其关闭:

for (i in [ 'a', 'b', 'c' ]) {
  echo i
  sh "echo \"from shell i=${i}\""
}

这会让你得到你想要的行为。

答案 1 :(得分:12)

扩展到Matts答案: 对于多行sh脚本,请使用

sh """
  echo ${paramName}
"""

而不是

sh '''...'''

答案 2 :(得分:2)

试试这个:

for (i in [ 'a', 'b', 'c' ]) {
    echo i
    sh '''
    echo "from shell i=$i"
    '''
}
相关问题