How to pass variables from Jenkinsfile to shell command

60,011

Solution 1

Your code is using a literal string and therefore your Jenkins variable will not be interpolated inside the shell command. You need to use " to interpolate your variable inside your strings inside the sh. ' will just pass a literal string. So we need to make a few changes here.

The first is to change the ' to ":

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

However, now we need to escape the " on the inside:

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

Additionally, if a variable is being appended directly to a string like you are doing above ($i onto i=), we need to close it off with some curly braces:

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

That will get you the behavior you desire.

Solution 2

Extension to Matts answer: For multi-line sh scripts use

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

instead of

sh '''
  echo ${paramName}
'''
Share:
60,011
Joe
Author by

Joe

Software Development Professional Some of my succeeded projects: http://www.jme.de/projects.html (german language)

Updated on December 03, 2020

Comments

  • Joe
    Joe over 3 years

    I want to use a variable which I am using inside of my Jenkinsfile script, and then pass its value into a shell script execution (either as an environment variable or command line parameter).

    But the following Jenkinsfile:

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

    Gives the output:

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

    Desired output is something like:

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

    Any idea how to pass the value of i to the shell scipt?

    Edit: Based upon Matt's answer, I now use this solution:

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

    The advantage is, that I don't need to escape the " in the shell script.