这是我直接的功能:
generate_post_data()
{
cat <<-EOF
{"stringData": {}}
EOF
}
这是我的另一个功能:
generate_curl_body()
{
template=$(generate_post_data $secret_id)
echo "$template"
echo "$KVS_VARIABLES" | while read -r key value
do
template=$(echo "$template" | jq ".stringData += { \"$key\" : \"$value\" }")
echo $template
done
}
输出为:
#Before while -> {"stringData": {}}
#1 iteration -> { "stringData": { "VAR1": "VAL1" } }
#2 iteration -> { "stringData": { "VAR1": "VAL1", "VAR2": "VAL2" } }
#3 iteration -> { "stringData": { "VAR1": "VAL1", "VAR2": "VAL2", "VAR3": "VAL3" } }
#After while -> {"stringData": {}}
为什么未填充template
变量?
答案 0 :(得分:0)
由于| while
在子shell中执行,因此未填充。来自manual page of Bash(例如):
管道中的每个命令都作为一个单独的进程(即在子外壳中)执行。
如果外壳是Bash,简单的解决方法是用此处字符串替换echo "$KVS_VARIABLES" |
:
while read -r key value; do
template=$(echo "$template" | jq ".stringData += { \"$key\" : \"$value\" }")
echo $template
done <<< "$KVS_VARIABLES"
如果您的外壳程序不接受此处的字符串,则可以始终将while
包装在复合命令{ while ... done; echo "$template"; }
中,并使用其他命令替换:
template="$(
echo "$KVS_VARIABLES" |
{
while read -r key value; do
template=$(
echo "$template" |
jq ".stringData += { \"$key\" : \"$value\" }"
)
done
echo "$template"
}
)"