如何将多个jq输出值传入while read -r循环并赋值给两个变量
问题原因
你的错误来自两个核心问题:
- jq输出逻辑错误:原写法
.[].name,.[].nested_name.name会先输出所有元素的name字段,再输出所有元素的nested_name.name字段,总共输出4行数据,而非每行对应一组你需要的两个字段。 - 变量拆分规则错误:
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
相关产品推荐
相关产品推荐

