Shell脚本:while变量串联

时间:2018-07-02 10:31:18

标签: shell

这是我直接的功能:

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变量?

1 个答案:

答案 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"
  }
)"