如何正确向jq传递参数?实现文件名作为JSON键的问题
解决jq中变量作为JSON键的问题
你遇到的问题是因为jq不会解析字符串字面量里的变量,比如{"$fn": {}}里的"$fn"会被直接当成键名,而不是解析为变量$fn的值。下面是几种正确的写法:
方法一:使用动态键语法(推荐)
用{$变量名: 值}的格式创建带动态键的对象,再合并到原JSON结构中:
# 用$()替代反引号,语法更规范 output=$(cat "$file" | jq --arg fn "$file_name" '. += {$fn: {}}') echo "$output" > "$file"
方法二:通过属性赋值方式
直接用.[$变量名] = 值的形式给原JSON添加动态键:
output=$(cat "$file" | jq --arg fn "$file_name" '.[$fn] = {}') echo "$output" > "$file"
更简洁的写法(直接修改文件)
用jq的-i(--in-place)选项直接修改源文件,省去中间变量和echo步骤:
jq --arg fn "$file_name" '. += {$fn: {}}' -i "$file"
原写法错误原因
{"$fn": {}}里的"$fn"是字符串字面量,jq不会将其解析为变量,只会当作普通键名。- 使用
--argjson时,单引号包裹的'{"$file_name": {}}'中的$file_name不会被shell解析,即使解析完成,传给jq的也是固定字符串键,无法实现动态变量替换。
内容的提问来源于stack exchange,提问作者lem
相关产品推荐
相关产品推荐

