在Groovy中运行ssh /bin/bash << EOF命令时变量失效如何解决?
问题原因
在Groovy脚本的sh步骤中,agent端的bash会处理here-doc中的转义字符与变量展开,导致远程bash收到的循环逻辑出现异常:原脚本里远程bash的\$letter被agent bash解析为$letter,但由于变量展开顺序问题,远程bash无法正确识别循环变量,最终输出空值。
解决方案
方案一:在远程shell中先定义变量再循环
通过在远程bash中先接收agent传递的变量值,再执行循环,确保变量被正确识别:
pipeline { stages { stage('print letters') { steps { script { env.letters = "a b c" sh ''' ssh centos@x.x.x.x /bin/bash << EOF # 远程shell中定义变量 letters="$letters" echo \$letters for letter in \$letters; do echo "hello \$letter" done EOF ''' } } } } }
方案二:使用带引号的here-doc分隔符
给远程bash的here-doc分隔符加单引号,避免agent bash展开远程脚本中的变量,同时用Groovy双引号字符串提前展开本地变量:
pipeline { stages { stage('print letters') { steps { script { env.letters = "a b c" sh """ ssh centos@x.x.x.x /bin/bash << 'EOF' echo ${letters} for letter in ${letters}; do echo "hello \$letter" done EOF """ } } } } }
方案三:通过ssh参数传递变量
将变量作为位置参数传递给远程bash,避免变量展开冲突:
pipeline { stages { stage('print letters') { steps { script { def letters = "a b c" sh ''' ssh centos@x.x.x.x /bin/bash -s "$1" << 'EOF' echo \$1 for letter in \$1; do echo "hello \$letter" done EOF ''' letters } } } } }
内容的提问来源于stack exchange,提问作者Bryan Tan
相关产品推荐
相关产品推荐

