我正在创建一个shell脚本。
我需要根据key-value
列表内容创建一个curl json主体。通过awk
拆分此内容,生成两列表:
KVS_VARIABLES=$(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $f)
示例输出:
VAR1 VAL1
VAR2 VAL2
VAR3 VAL3
因此,此表在一段时间的迭代中进行了迭代,并且每个key
和value
都被拆分了:
echo "$KVS_VARIABLES" | while read -r kv
do
key=$(echo $kv | awk '{print $1}')
value=$(echo $kv | awk '{print $2}')
done
因此,我需要某种方式将这些内容聚合到json文档中,以便使用curl
发送出去:
curl -k \
-X PUT \
-d @- \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
"$SERVER_URL/api/v1/namespaces/$NAMESPACE/secrets/$SECRET_ID" <<-EOF
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {
"name": "$SECRET_ID"
},
"stringData": {
"$key": "$value" <<<<<<<<<<<<<(1)>>>>>>>>>>>>>>
}
}
EOF
因此,在<<<<<<<<<<<<<(1)>>>>>>>>>>>>>>
上,我需要汇总每个key
和value
传播。
因此,在这种情况下,我需要生成:
"VAR1": "VAL1",
"VAR2": "VAL2",
"VAR3": "VAL3"
,然后将其插入“ stringData”中:
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {
"name": "$SECRET_ID"
},
"stringData": {
<<<<<<<<<<<<<(1)>>>>>>>>>>>>>>
}
}
所以,毕竟:
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {
"name": "$SECRET_ID"
},
"stringData": {
"VAR1": "VAL1",
"VAR2": "VAL2",
"VAR3": "VAL3"
}
}
jq
已安装。
有什么想法吗?
答案 0 :(得分:1)
您不需要在while循环内需要awk
语句,而只需读取read
命令本身内的键值对。
也将awk
输出存储在变量中,然后进行解析是一种反模式。您可以使用外壳程序提供的进程替换功能,< <()
部分将使命令输出像在文件中一样(或)使用here字符串
json=$(cat <<-EOF
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {
"name": "$SECRET_ID"
},
"stringData": {
}
}
EOF
)
while read -r key value; do
json=$(echo "$json" | jq ".stringData += { \"$key\" : \"$value\" }")
done< <(awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' $f)
您现在可以将"$json"
中的变量curl
用作
curl -k \
-X PUT \
-d @- \
-H "Authorization: Bearer $TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
"$SERVER_URL/api/v1/namespaces/$NAMESPACE/secrets/$SECRET_ID" <<<"$json"