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}" """ } } } } }
关键说明
- Groovy变量赋值:在script块内先通过Groovy语法
params['参数名']获取参数值,赋值给无空格的变量,避免shell解析问题。 - shell命令包裹方式:用三引号
"""包裹shell脚本,Groovy会自动替换其中的${变量名}为对应值,再传递给shell执行。 - 引号转义:如果需要在输出中保留双引号,用
\\"转义,确保shell正确解析。
内容的提问来源于stack exchange,提问作者anotheropsguy
相关产品推荐
相关产品推荐

