在Jenkins管道中的bash中对文件进行迭代失败,并导致MissingPropertyException

在Jenkins管道中的bash中对文件进行迭代失败,并导致MissingPropertyException,bash,jenkins,jenkins-pipeline,Bash,Jenkins,Jenkins Pipeline,我在Jenkins中有管道作业,有一个步骤执行此bash脚本: sh """ $ANDROID_HOME/platform-tools/adb pull /sdcard/Pictures/screenshots if [ "$DEFAULT_LOCALE" = "en" ] then DEFAULT_LOCALE="en-US" fi if [ "${env.UPDATE_BASE}" == "true" ] ||

我在Jenkins中有管道作业,有一个步骤执行此bash脚本:

sh """
      $ANDROID_HOME/platform-tools/adb pull /sdcard/Pictures/screenshots
      if [ "$DEFAULT_LOCALE" = "en" ]
      then
          DEFAULT_LOCALE="en-US"
      fi

      if [ "${env.UPDATE_BASE}" == "true" ] || [ ! -d "${env.CACHE_HOME}/${env.BRANCH}" ]; then
        if [ ! -d "${env.CACHE_HOME}/${env.BRANCH}" ]; then
          mkdir -p ${env.CACHE_HOME}/${env.BRANCH}
        fi
        for imgfile in screenshots/*.png; do
          if [[ $imgfile == *"_${env.DEFAULT_LOCALE}-"*.png ]]; then
            cp -rf screenshots/$imgfile ${env.CACHE_HOME}/${env.BRANCH}
          fi
        done
      else
        rm -f screenshots/*_${env.DEFAULT_LOCALE}-*.png
        cp -rf ${env.CACHE_HOME}/${env.BRANCH}/* screenshots
      fi
    """
但是,当管道到达此步骤时,它将失败并出现以下错误:

groovy.lang.MissingPropertyException: No such property: imgfile for class: groovy.lang.Binding

脚本中有什么错误?

如果所有变量都是shell变量,那么应该使用三个单引号

如果您混合使用shell和Groovy变量(或者仅使用Groovy变量),那么应该使用三重双引号

为了在后一种情况下推迟对shell变量的求值,您需要使用以下其中一种形式(我不确定是哪种形式)来转义它们的美元符号:


如果所有变量都是shell变量,那么应该使用三个单引号

如果您混合使用shell和Groovy变量(或者仅使用Groovy变量),那么应该使用三重双引号

为了在后一种情况下推迟对shell变量的求值,您需要使用以下其中一种形式(我不确定是哪种形式)来转义它们的美元符号:


您不需要
sh-c
还是
bash-c
sh
不接受
[[
除非您的系统配置了链接到
bash
shell的
sh
符号。最好使用
bash
运行。无论哪种方式,您都应该一致地使用相同样式的方括号。两者都在使用。@KamilCuk:
sh
显然是一个Jenkins命令,而
-c
不是必需的。您不需要
sh吗-c
或者更确切地说
bash-c
sh
不接受
[[
除非您的系统配置了链接到
bash
shell的
sh
符号。最好使用
bash
运行。无论哪种方式,您都应该一致地使用相同样式的方括号。两者都在使用。@KamilCuk:
sh
显然是一个Jenkins命令,而
-c
不是必需的。
if [[ \$imgfile == *"_${env.DEFAULT_LOCALE}-"*.png ]]; then
if [[ \\$imgfile == *"_${env.DEFAULT_LOCALE}-"*.png ]]; then
if [[ ${'$'}imgfile == *"_${env.DEFAULT_LOCALE}-"*.png ]]; then