使用 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
我正在编写一个 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