首页 > 解决方案 > 如何在 Jenkins 多行 shell 脚本中使用 bash 变量

问题描述

我没有成功尝试在 Jenkins 管道中使用 bash 变量。

我的第一次尝试

sh """#!/bin/bash
    for file in *.map; do
        filename=`basename $file .map`
        echo "##### uploading ${$filename}"

        curl  -X POST ${SERVER_URL}/assets/v1/sourcemaps \
              -F service_name="${SERVICE_NAME}" \
              -F service_version="${revision}" \
              -F bundle_filepath="${main_url}${filename}" \
              -F sourcemap="@${filename}.map" &
    done
    wait
"""

导致异常:MissingPropertyException: No such property: file

第二次尝试,看到这个答案后https://stackoverflow.com/a/35047530/9590251

sh """#!/bin/bash
    for file in *.map; do
        filename=`basename \$file .map`
        echo "##### uploading \$filename"

        curl  -X POST ${SERVER_URL}/assets/v1/sourcemaps \
              -F service_name="${SERVICE_NAME}" \
              -F service_version="${revision}" \
              -F bundle_filepath="${main_url}\$filename" \
              -F sourcemap="@\$filename.map" &
    done
    wait
"""

简单地省略了 bash 变量。所以 $filename 是空的。

在这种情况下,我如何需要对 bash 变量进行属性编码?

标签: bashjenkinsgroovy

解决方案


试试这个:

sh """#!/bin/bash
    set -x    

    for file in *.map; do
        filename="\$(basename "\$file" .map)"
        echo "Uploading \$filename"

        curl  -X POST "${SERVER_URL}/assets/v1/sourcemaps" \
              -F service_name="${SERVICE_NAME}" \
              -F service_version="${revision}" \
              -F bundle_filepath="${main_url}\$filename" \
              -F sourcemap="@\${filename}.map" &
    done
    wait
"""

推荐阅读