如何将JSON键值对传入BASH命令并转为空格分隔的单行格式
实现BASH中JSON键值对转空格分隔单行的方案
你可以通过修改jq语句或者额外加shell管道两种方式实现需求:
方案1:直接修改jq逻辑输出单行(推荐)
不需要额外拼接管道,仅靠jq本身的能力就能输出目标格式,代码如下:
a='{"first": "a", "second": "b"}' echo "$a" | jq -r 'to_entries | map(.key + "=" + .value) | join(" ")'
运行后直接输出:first=a second=b
逻辑说明:
to_entries将JSON对象转换为由{key:xxx, value:xxx}元素组成的数组map()遍历数组,把每个元素拼接为key=value格式的字符串join(" ")将数组中所有字符串用空格拼接为单个字符串输出
方案2:用shell工具替换换行符(兼容低版本jq)
如果你的jq版本较低不支持上述语法,可以加tr命令将换行符替换为空格:
a='{"first": "a", "second": "b"}' echo "$a" | jq -r 'to_entries | .[] | .key + "=" + .value' | tr '\n' ' '
如果需要末尾自动补换行,可以改成如下写法:
echo $(echo "$a" | jq -r 'to_entries | .[] | .key + "=" + .value' | tr '\n' ' ')
特殊场景注意
如果你的JSON值包含空格、引号等特殊字符,后续要将结果作为参数传入其他命令时,建议用bash数组接收更稳妥,避免解析错误:
# 将键值对逐行存入bash数组 mapfile -t kv_args < <(echo "$a" | jq -r 'to_entries | .[] | .key + "=" + .value') # 调用命令时直接传入数组即可 your_target_command "${kv_args[@]}"
内容的提问来源于stack exchange,提问作者smallbirds
相关产品推荐
相关产品推荐

