时髦逃逸双引号$

时间:2018-08-02 17:28:42

标签: groovy jenkins-pipeline

我在Jenkins管道中运行了这个shell脚本

def planResults = sh(returnStdout: true, script: "cd $it; PLAN=\$(terragrunt plan --terragrunt-source-update | landscape); echo "$PLAN"; CHANGES=$(echo "$PLAN" | tail -2); echo $CHANGES")

问题是当我尝试回显“ $ PLAN”变量时。

这是groovy推荐的解决方案,它可以在PLAN设置为\ $(terragrunt的位置附近使用,但是对于$内的双引号不起作用。我需要双引号才能使此命令正常工作。

solution: either escape a literal dollar sign "\$5" or bracket the value 
expression "${5}" @ line 34, column 148.
ce-update | landscape); echo "$PLAN"; CH

谢谢!

1 个答案:

答案 0 :(得分:4)

对于双引号字符串,Groovy将首先对字符串进行插值。

因为itPLANCHANGES是Shell的运行时变量,而不是Groovy运行时的变量。 Groovy在插值期间无法从Groovy变量堆栈中找到响应值来替换$it/PLAN/CHANGS

因此,如果在这种情况下使用双引号,则需要转义所有$

script: "cd \$it; PLAN=\$(terragrunt plan --terragrunt-source-update | landscape); 
         echo \$PLAN; CHANGES=\$(echo \$PLAN | tail -2); echo \$CHANGES"

或使用不支持插值的单引号:

script: 'cd $it; PLAN=$(terragrunt plan --terragrunt-source-update | landscape); 
             echo $PLAN; CHANGES=$(echo $PLAN | tail -2); echo $CHANGES'

有关here上Groovy字符串的更多详细信息