bash调用jq循环提取字段写入文件时内容不换行问题
问题根因
- 无引号包裹的命令替换会丢失换行符:当你执行
echo $(_jq '.dependencies[].name')时,Bash会对命令替换返回的结果做字段分割,把原有的换行符、制表符等空白字符统一替换为单个空格,最终输出的就是空格分隔的单行内容。 - 外层循环逻辑冗余:你对整个JSON对象执行
@base64转码只会得到1个结果,外层for循环实际仅执行1次,完全没有起到遍历dependencies数组的作用。
解决方案
方案1:最小改动修复现有写法
给命令替换加上双引号,保留输出内容的原始换行符即可:
#!/bin/bash for row in $(jq -r '. | @base64' recipe.json); do _jq() { echo "${row}" | base64 --decode | jq -r "${1}" } # 为命令替换加双引号保留换行 echo "$(_jq '.dependencies[].name')" >> file.log done
方案2:简化冗余逻辑(更推荐)
你要提取所有依赖的名称,完全不需要额外做base64转码和循环,一行jq命令即可实现需求:
#!/bin/bash jq -r '.dependencies[].name' recipe.json >> file.log
如果你需要逐行处理每个依赖名称,可搭配while read实现:
#!/bin/bash while IFS= read -r dep_name; do # 此处可添加针对单个依赖名称的处理逻辑 echo "${dep_name}" >> file.log done < <(jq -r '.dependencies[].name' recipe.json)
以上方案执行后,file.log中会分两行保存ethereal和new两个值。
内容的提问来源于stack exchange,提问作者dani 'SO learn value newbies'
相关产品推荐
相关产品推荐

