Linux bash中使用jq创建含变量键的JSON对象报错求助
解决jq动态变量键的问题
问题原因
你的命令报错是因为没有将Shell变量正确传递给jq,且jq中动态键的引用方式需要调整:
- jq里的
$key是jq自身的变量,默认不会关联Shell的$key变量 - 直接用双引号包裹jq表达式会导致Shell提前解析变量,容易引发语法混乱或特殊字符错误
正确实现方式
jq支持动态变量键,只需通过--arg(字符串类型)或--argjson(JSON类型,如数字、数组)参数将Shell变量传入jq环境,再用($变量名)作为键名即可。
1. 键值均为字符串的场景
# 假设已定义Shell变量key和value key="sender" value="Alice" # 直接让jq读取文件,无需cat管道 new_json_object=$(jq --arg k "$key" --arg v "$value" '. += {($k): $v}' last_sms.json) echo "$new_json_object" | jq '.'
2. 值为JSON类型的场景
如果value是数字、布尔值、数组或对象,改用--argjson传递:
key="unread_count" value=5 new_json_object=$(jq --arg k "$key" --argjson v "$value" '. += {($k): $v}' last_sms.json) echo "$new_json_object" | jq '.'
关键说明
--arg k "$key":将Shell变量$key赋值给jq内部变量$k{($k): $v}:用括号包裹$k,告诉jq这是一个动态键名,而非固定字符串- 避免用
cat last_sms.json | jq ...的写法,直接让jq读取文件更高效且简洁
内容的提问来源于stack exchange,提问作者cidy.long
相关产品推荐
相关产品推荐

