【问题标题】:Is it possible to populate a variable in a literal string using bash是否可以使用 bash 在文字字符串中填充变量
【发布时间】:2021-11-07 20:21:59
【问题描述】:

我目前正在从 dynamodb 获取一个值并将其存储为 env var,这是我存储 terraform 状态的 s3 存储桶名称,即 tf-state-$ENV。

我想将字符串中的 $ENV 替换为我在 jenkins 中为相关环境设置的另一个环境变量,例如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 等。

【问题讨论】:

  • 你的代码不能产生你从echo $tf_bucket得到的输出

标签: bash jenkins


【解决方案1】:

使用 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

【讨论】:

  • jq可以直接访问环境变量
  • 将其通过envsubst 传递比使用eval 更安全,但会替换所有环境变量引用,而不仅仅是$ENV
【解决方案2】:

按照@gordon-davisson 的建议通过 envsubst 进行管道处理非常有用,感谢您的所有建议!

【讨论】:

    【解决方案3】:

    你可以直接使用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']

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 2023-03-31
      • 2020-10-01
      • 1970-01-01
      • 2021-02-05
      相关资源
      最近更新 更多