如何在Bash中实现字面量字符串的变量填充,无需使用sed等工具
解决方案
纯Bash原生实现
直接用Bash内置的参数替换功能,无需调用sed等外部工具,操作步骤如下:
- 从DynamoDB拉取值时建议给jq加上
-r参数,输出原始字符串避免多余的引号干扰 - 使用Bash变量替换语法把字面量
$ENV替换为当前环境的ENV变量值
完整代码示例:
# 从DynamoDB获取存储桶名称原始值 export tf_bucket=$(aws dynamodb --region eu-west-1 get-item --table-name terraform-jenkins-params --key '{"module": {"S": "compute"}}' | jq -r '.Item.tf_s3_bucket.S') # 执行变量替换,\$用于匹配原始字符串中的字面量$符号 tf_bucket=${tf_bucket//\$ENV/$ENV} # 验证输出 echo $tf_bucket
如果你的字符串中$ENV只出现1次,也可以把//换成/,单斜杠代表替换第一个匹配项即可。
Jenkins Pipeline实现
如果是在Jenkinsfile中处理,可以直接用Groovy原生的字符串替换方法,示例如下:
pipeline { agent any environment { // ENV可以从Jenkins构建参数、其他环境变量动态获取 ENV = 'dev' // 拉取DynamoDB中的原始存储桶名称,trim()去除末尾换行符 tf_bucket = sh(script: 'aws dynamodb --region eu-west-1 get-item --table-name terraform-jenkins-params --key \'{"module": {"S": "compute"}}\' | jq -r \'.Item.tf_s3_bucket.S\'', returnStdout: true).trim() } stages { stage('处理存储桶名称') { steps { script { // 执行替换 tf_bucket = tf_bucket.replace('\$ENV', env.ENV) // 输出验证 echo tf_bucket } } } } }
以上两种方案均使用对应运行环境的原生语法,没有调用sed等外部文本处理工具,符合需求。
内容的提问来源于stack exchange,提问作者gdix0n
相关产品推荐
相关产品推荐

