使用 shell 脚本在 json 中传递动态地形变量

Passing dynamic terraform variables in json using shell script

我正在编写一个 shell 脚本,用于使用 shell.

将 json 文件中的关键字替换为动态值

123.json

{
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "arn:aws:iam::xxxxxx:role/role1",
            "arn:aws:iam::yyyyyy:role/role2"
          ]
        },
        "Action": "sts:AssumeRole",
        "Condition": {}
      }
    ]
  }

我正在获取 role1 和 role2 的值作为 shell 脚本中的 terraform 变量

shell.sh 文件有

echo $role1
echo $role2

$ cat 123.json | sed -n '/role1/ s/role1/$role/ p' 
$ cat 123.json | sed -n '/role1/ s/role1/$role/ p' 

但是角色 1 和角色 2 没有更新。谁能帮帮我。

你的 sed 命令不起作用,因为 shell 没有扩展变量 在单引号中。但是 sed 并不是编辑结构化的好工具 JSON - jq 等格式是更好的选择:

jq --argjson foo "\"$role1\"" '.Statement[].Principal.AWS[0] |= sub("role1$";$foo)' < 123.json
jq --argjson foo "\"$role2\"" '.Statement[].Principal.AWS[1] |= sub("role2$";$foo)' < 123.json

"\"$role2\"" 从 shell 个变量创建一个 jq 变量 在开头和结尾添加双引号。

要将输出保存回文件,您需要使用外部实用程序,因为 jq 没有 sed 等工具所具有的 -i 选项。你可以 要么使用 sponge 这是一部分 moreutils:

$ jq --argjson foo "\"$role1\"" '.Statement[].Principal.AWS[0] |= sub("role1$";$foo)' < 123.json | sponge 123.json
$ jq --argjson foo "\"$role2\"" '.Statement[].Principal.AWS[1] |= sub("role2$";$foo)' < 123.json | sponge 123.json

或手动写入临时文件并移动文件代替 123.json:

$ temp="$(mktemp)"
$ jq --argjson foo "\"$role1\"" '.Statement[].Principal.AWS[0] |= sub("role1$";$foo)' < 123.json  > "$temp"
$ mv "$temp" 123.json
$ temp="$(mktemp)"
$ jq --argjson foo "\"$role2\"" '.Statement[].Principal.AWS[1] |= sub("role2$";$foo)' < 123.json > "$temp"
$ mv "$temp" 123.json