You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改JQ过滤器,生成逗号分隔的键值对?

问题描述

现有如下Bash脚本:

#!/bin/bash
js="{\"fizz\":\"buzz\",\"foo\":\"baz\"}"
echo $js

json=$(echo "$js" | jq -r "to_entries|map(\"\(.key)=\(.value|tostring)\")|.[]")

echo "fetching secret json:"
echo $json

运行后输出为:

myuser@mymachine myapp % bash myscript.sh
{"fizz":"buzz","foo":"baz"}
fetching secret json:
fizz=buzz foo=baz

实际使用的JSON包含更多扁平键值对(无嵌套对象),需要将输出的键值对改为逗号分隔的形式,即得到:

fizz=buzz,foo=baz
解决方案

直接修改JQ过滤器即可实现需求,推荐使用join(",")替代原过滤器末尾的.[],修改后的脚本如下:

#!/bin/bash
js="{\"fizz\":\"buzz\",\"foo\":\"baz\"}"
echo $js

json=$(echo "$js" | jq -r 'to_entries | map("\(.key)=\(.value|tostring)") | join(",")')

echo "fetching secret json:"
echo $json

原理说明

  • 原过滤器中的.[]会将数组内的每个键值对单独输出(每行一个),后续通过Bash变量展开时换行被替换为空格,最终得到空格分隔的结果。
  • 改用join(",")后,JQ会直接将数组中的所有键值对用逗号连接成单个字符串输出,无需依赖Bash处理换行和空格,避免了值中包含空格时出现的异常问题,结果更可靠。

运行修改后的脚本,输出将符合预期:

myuser@mymachine myapp % bash myscript.sh
{"fizz":"buzz","foo":"baz"}
fetching secret json:
fizz=buzz,foo=baz

内容的提问来源于stack exchange,提问作者hotmeatballsoup

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:00:56