You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins Pipeline脚本块读取含空格参数报错求助

Jenkins Pipeline读取带空格参数的Bad Substitution错误解决

问题描述

在Jenkins Pipeline的script块中读取名称包含空格的参数时遭遇bad substitution错误,涉及两个来自嵌入式HTML的参数:

  • Premium Account Type:选择参数
  • Hierarchical Namespace:复选框参数

以下是之前的尝试及对应报错:

尝试1 代码

echo    premiumAccountType=\\"${params.\\"Premium Account Type\\"}\\"    >> $WORKSPACE/azr-storage-account/account.auto.tfvars
echo    is_hns_enabled=\\"${params.\\"Hierarchial Namespace\\"}\\"    >> $WORKSPACE/account.auto.tfvars
echo "{params.\"Premium Account Type\"} --- ${params.\"Hierarchial Namespace\"}"

报错信息

/var/jenkins_home/workspace/test@tmp/durable-5c75f1d0/script.sh: line 37: premiumAccountType=\"${params."Premium Account Type"}\": bad substitution
/var/jenkins_home/workspace/test@tmp/durable-5c75f1d0/script.sh: line 38: is_hns_enabled=\"${params."Hierarchial Namespace"}\": bad substitution
/var/jenkins_home/workspace/test@tmp/durable-5c75f1d0/script.sh: line 39: } --- ${params."Hierarchial Namespace"}: bad substitution

尝试2(去掉引号)代码

echo    premiumAccountType=\\"${params.Premium Account Type}\\"    >> $WORKSPACE/azr-storage-account/account.auto.tfvars
echo    is_hns_enabled=\\"${params.\"Hierarchial Namespace\"}\\"    >> $WORKSPACE/account.auto.tfvars
echo "TESTING ---- {params.Premium Account Type} --- ${params.\"Hierarchial Namespace\"}: "

报错信息

/var/jenkins_home/workspace/test@tmp/durable-75ec08a0/script.sh: line 37: premiumAccountType=\"${params.Premium Account Type}\": bad substitution
/var/jenkins_home/workspace/test@tmp/durable-75ec08a0/script.sh: line 38: is_hns_enabled=\"${params."Hierarchial Namespace"}\": bad substitution
/var/jenkins_home/workspace/test@tmp/durable-75ec08a0/script.sh: line 39: TESTING ---- {params.Premium Account Type} --- ${params."Hierarchial Namespace"}: 

尝试3 代码

echo "premiumAccountType=${params['Premium Account Type']}" >> $WORKSPACE/azr-storage-account/account.auto.tfvars
echo "is_hns_enabled=${params['Hierarchial Namespace']}" >> $WORKSPACE/account.auto.tfvars
echo "${params['Premium Account Type']} --- ${params['Hierarchial Namespace']}"

报错信息

/var/jenkins_home/workspace/test@tmp/durable-6dd893b6/script.sh: line 38: is_hns_enabled=\"${params.\"Hierarchial\ Namespace\"}\": bad substitution
/var/jenkins_home/workspace/test@tmp/durable-6dd893b6/script.sh: line 39: Premium Account Type: syntax error in expression (error token is "Account Type")
/var/jenkins_home/workspace/test@tmp/durable-6dd893b6/script.sh: line 40: Hierarchial Namespace: syntax error in expression (error token is "Namespace")
/var/jenkins_home/workspace/test@tmp/durable-6dd893b6/script.sh: line 41: Premium Account Type: syntax error in expression (error token is "Account Type")
/var/jenkins_home/workspace/test@tmp/durable-6dd893b6/script.sh: line 42: ---> $premiumAccountType ---> ${env.premiumAccountType}: bad substitution

错误原因

script块本质是执行shell脚本,但你错误地在shell环境中直接使用了Groovy的params语法(比如${params['xxx']})。shell无法识别Groovy的变量引用方式,因此抛出bad substitution或语法错误。

解决方案

先在Groovy上下文(script块外或script块内的Groovy代码段)中将带空格的参数赋值给普通变量,再在shell命令中引用这些变量。

正确代码示例

pipeline {
    agent any
    parameters {
        choice(name: 'Premium Account Type', choices: ['Premium_LRS', 'Premium_GRS'], description: '选择存储账户类型')
        booleanParam(name: 'Hierarchical Namespace', defaultValue: false, description: '是否启用分层命名空间')
    }
    stages {
        stage('Test') {
            steps {
                script {
                    // 先在Groovy中把参数赋值给变量
                    def premiumType = params['Premium Account Type']
                    def hnsEnabled = params['Hierarchical Namespace']

                    // 在shell中引用Groovy变量(用双引号包裹shell命令,让Groovy替换变量)
                    sh """
                        echo "premiumAccountType=\\"${premiumType}\\"" >> ${WORKSPACE}/azr-storage-account/account.auto.tfvars
                        echo "is_hns_enabled=\\"${hnsEnabled}\\"" >> ${WORKSPACE}/account.auto.tfvars
                        echo "${premiumType} --- ${hnsEnabled}"
                    """
                }
            }
        }
    }
}

关键说明

  1. Groovy变量赋值:在script块内先通过Groovy语法params['参数名']获取参数值,赋值给无空格的变量,避免shell解析问题。
  2. shell命令包裹方式:用三引号"""包裹shell脚本,Groovy会自动替换其中的${变量名}为对应值,再传递给shell执行。
  3. 引号转义:如果需要在输出中保留双引号,用\\"转义,确保shell正确解析。

内容的提问来源于stack exchange,提问作者anotheropsguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:35:24