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

如何将多个jq输出值传入while read -r循环并赋值给两个变量

问题原因

你的错误来自两个核心问题:

  1. jq输出逻辑错误:原写法.[].name,.[].nested_name.name会先输出所有元素的name字段,再输出所有元素的nested_name.name字段,总共输出4行数据,而非每行对应一组你需要的两个字段。
  2. 变量拆分规则错误:read默认以空格、制表符、换行作为分隔符拆分内容,只要你的字段值里包含空格,就会被拆分成多个变量赋值,不符合预期。
解决方案

调整jq输出格式,将同一对象的两个字段用特殊分隔符拼接为一行,再指定read用同样的分隔符拆分即可:

echo "$foo" | jq -r '.[] | "\(.name)\t\(.nested_name.name)"' | while IFS=$'\t' read -r foo bar; do
    # 此处执行业务逻辑即可
    echo "foo = \"$foo\""
    echo "bar = \"$bar\""
done

代码说明

  • jq加-r参数会输出原始字符串,自动去掉JSON字符串的外层引号
  • jq遍历每个数组元素时,直接把当前元素的两个字段用制表符\t拼接为一行输出,保证每行对应一组你需要的变量值
  • IFS=$'\t'指定本次read仅用制表符作为分隔符,只要你的字段值里没有制表符就不会被错误拆分

极端场景兼容(字段含制表符)

如果你的字段值可能包含制表符,可以改用空字符\0作为分隔符,兼容性更强:

echo "$foo" | jq -j '.[] | "\(.name)\u0000\(.nested_name.name)\u0000"' | while IFS= read -r -d $'\0' foo && IFS= read -r -d $'\0' bar; do
    # 执行业务逻辑
done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 19:54:00