我目前正在从dynamodb中获取一个值,并将其存储为env-var,env-var是我存储地形状态的s3存储桶名称,即tf state-$env。
我想用我在jenkins中为相关环境设置的另一个环境变量替换字符串中的$ENV,例如dev、test等,因为这是环境之间的唯一区别。
export tf_bucket=$(aws dynamodb --region eu-west-1 get-item --table-name terraform-jenkins-params --key '{"module": {"S": "compute"}}'| jq '.Item.tf_s3_bucket[]')
echo $tf_bucket
tf-state-$ENV
echo $ENV
dev
Wanted output
echo $tf_bucket
tf-state-dev
这可以使用bash或jenkins来完成,如果可能的话,我尽量避免使用sed等。
使用bash模式替换:
tf_bucket=${tf_bucket//"$ENV"/$ENV}
这将替换$ENV
的所有出现。
一个斜线只替换第一个出现的:
tf_bucket=${tf_bucket/"$ENV"/$ENV}
编辑:
这可能会引入代码注入漏洞,但可以使用eval
实际扩展字符串中的任何变量:
eval "tf_bucket=$tf_bucket"
echo "$tf_bucket"
# gives
tf-state-dev
或者类似地,将$tf_bucket
与bash -c
:一起使用
export ENV
bash -c "echo $tf_bucket"
# gives
tf-state-dev
按照@gordon davisson的建议,通过envsubst进行管道输送真是太棒了,感谢您的所有建议!
您可以直接使用jq
,如本例所示:
test.json
{
"Item": {
"tf_s3_bucket": [
"tf-state-$ENV"
]
}
}
在bash:
export ENV=foo
jq '.Item.tf_s3_bucket[]|sub("\$ENV";$ENV["ENV"])' test.json
注意:不要被以上示例中ENV
的双重使用所混淆。这是因为$ENV
是jq中的一个保留变量,包含一个包含所有环境变量的数组。因为您将变量命名为ENV,所以它是$ENV['ENV']