2017-01-08 33 views
6

Chcę użyć zmiennej, której używam wewnątrz mojego skryptu Jenkinsfile, a następnie przekazać jej wartość do wykonania skryptu powłoki (jako zmiennej środowiskowej lub parametru wiersza poleceń).Jak przekazać zmienne z Jenkinsfile do polecenia powłoki

Ale po Jenkinsfile:

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

Daje wyjście:

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

Pożądany wyjście jest coś takiego:

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

jakiś pomysł, jak przekazać wartość i do the shell scipt?

Edit: oparciu Matt's odpowiedź, teraz korzystać z tego rozwiązania:

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

Zaletą jest to, że nie trzeba uciec " w skrypcie powłoki.

Odpowiedz

8

Twój kod wykorzystuje ciągiem znaków, a zatem zmienna Jenkins nie będą interpolowane wewnątrz polecenia powłoki. Musisz użyć ", aby interpolować zmienną wewnątrz twoich ciągów wewnątrz sh. ' po prostu przekazuje ciąg literalny. Musimy wprowadzić tutaj kilka zmian.

Pierwszy to zmienić ' do ":

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

Jednak teraz musimy uciec " na planie:

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

Dodatkowo, jeśli zmienna jest dołączany bezpośrednio do ciągu takiego jak powyżej ($i na i=), musimy go zamknąć za pomocą nawiasów klamrowych:

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

To da ci pożądane zachowanie.

2

spróbuj tego:

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

nie mogę sprawdzić, ale również starają się otoczyć var ​​jak to $ {i} – chenchuk

+2

Obie nie będą działać. Sprawdzanie składni groovy, różnica między '' 'i' '' 'jest po prostu ciągiem pojedynczej linii w stosunku do ciągu wielowierszowego. – Joe

+0

Wierzę, że "sh" "" zadziała, tj. Potrójne podwójne cudzysłowy zamiast potrójnych pojedynczych cudzysłowów –

3

Rozszerzenie Matts odpowiedź: skryptów sh obsługujący kilka linii używać

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

zamiast

sh '''...'''