是否可以使用bash在文本字符串中填充变量



我目前正在从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_bucketbash -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']

最新更新