【问题标题】:Using environment variables within a Bash script in Jenkins在 Jenkins 的 Bash 脚本中使用环境变量
【发布时间】:2026-01-19 16:45:01
【问题描述】:

我知道有一些关于如何执行此操作的答案的问题,但是当我将变量用双引号括起来时,我似乎仍然无法让我的方案工作。

我正在执行 curl 请求以在 Jenkins 中获取有效的 crumb,以便我可以通过 POST 请求执行作业。

所以目前我得到像 Password Invalid 这样的响应,因为变量 ${USER_TOKEN} 未被识别

echo "The USER TOKEN is " ${USER_TOKEN} # This outputs 123456789 for example
CRUMB=$(curl -s 'http://jenkins:${USER_TOKEN}@localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField, ":",//crumb)')

如果我对USER_TOKEN 进行硬编码,那么这将起作用,但我显然想避免这种情况。

如何执行这个curl 命令并传入USER_TOKEN

更新

如果我用双引号将${USER_TOKEN} 括起来,我仍然会得到同样的错误。

CRUMB=$(curl -s 'http://jenkins:"${USER_TOKEN}"@localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField, ":",//crumb)')

如果我用双引号括住 curl 请求,我会得到

Invalid Xpath expression, contact(//crumbRequestField,:,//crumb)
Unexpected ':'

【问题讨论】:

  • 为什么不能双引号呢? curl -s 'http://jenkins:'"${USER_TOKEN}"'@localhost?

标签: bash jenkins environment-variables quoting


【解决方案1】:

您需要对包含双引号的字符串进行双引号。这是一种方式:

CRUMB=$(curl -s "http://jenkins:${USER_TOKEN}@localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField, "'":"'",//crumb)")

【讨论】:

    【解决方案2】:

    试试这个方法

    CRUMB=$(curl -s "http://jenkins:"${USER_TOKEN}"@localhost:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField, \":\",//crumb)")
    

    如果你想在你的字符串中扩展一个变量,那么整个字符串必须用双引号括起来。单引号可防止任何 bash 评估。此外,您必须转义整个字符串中的任何双引号。

    【讨论】: