如何用bash与jq为JSON文件添加JSON对象类型属性
解决JSON对象属性被转成字符串写入的问题
你的脚本核心问题是把JSON对象转成了字符串传递给jq,导致最终写入的是字符串而非原始JSON结构。以下是修复方案:
错误根源
xargs会把jq输出的结构化JSON扁平化处理成无格式字符串,破坏了JSON结构- 使用
--arg传递参数时,jq会将其视为字符串类型,而非JSON对象
优化后的脚本
if [ ! -f "$src_file" ]; then echo "Source file $src_file does not exist" exit 1 fi if [ ! -f "$dst_file" ]; then echo "Destination file $dst_file does not exist" exit 1 fi # 校验源文件是否包含devDependencies键 if ! jq '.devDependencies' "$src_file" >/dev/null 2>&1; then echo "The key \"devDependencies\" does not exist in source file $src_file" exit 1 fi # 直接读取源文件的devDependencies JSON对象,合并到目标文件 # 使用临时文件避免中途损坏原目标文件 jq --slurpfile src "$src_file" '. + {devDependencies: $src[0].devDependencies}' "$dst_file" > "$dst_file.tmp" && mv "$dst_file.tmp" "$dst_file" echo "devDependencies已成功添加到目标文件"
关键改进点
- 移除
xargs,保留jq输出的原始JSON结构 - 使用
--slurpfile让jq直接加载源文件,避免额外的子shell调用和变量传递 - 通过临时文件写入后替换的方式,防止目标文件因jq执行失败而损坏
如果需要动态指定键名(比如你的原脚本用$key变量),可以修改为:
key="devDependencies" jq --slurpfile src "$src_file" --arg key "$key" '. + {($key): $src[0][$key]}' "$dst_file" > "$dst_file.tmp" && mv "$dst_file.tmp" "$dst_file"
内容的提问来源于stack exchange,提问作者Nowis
相关产品推荐
相关产品推荐

