如何使用jq将Bash环境变量传入JSON的双引号字符串中
解决方案
错误原因
- jq执行命令参数顺序错误:
--arg需完整传入「变量名+变量值」配对参数,所有参数定义需放在-f 模板文件之前,否则会被错误识别为模板文件路径 - jq 字符串内插不支持直接写
$变量名,需用\($变量名)语法包裹变量,才能在双引号字符串内正确解析传入的变量值
操作步骤
- 调整
message.jq模板内容,使用jq官方字符串内插语法:
{ "Subject": { "Data": "Value \($value1)", "Charset": "UTF-8" }, "Body": { "Text": { "Data": "Value \($value2)", "Charset": "UTF-8" }, "Html": { "Data": "Data example", "Charset": "UTF-8" } } }
- 调整执行命令,正确传入bash变量:
假设你bash中需要传入的两个变量分别为$bash_val1、$bash_val2,执行命令如下:
jq -n --arg value1 "$bash_val1" --arg value2 "$bash_val2" -f message.jq
可选简化方案
如果不想单独维护jq模板文件,也可以直接把模板逻辑写在bash命令中:
jq -n --arg value1 "$bash_val1" --arg value2 "$bash_val2" ' { "Subject": {"Data": "Value \($value1)", "Charset": "UTF-8"}, "Body": { "Text": {"Data": "Value \($value2)", "Charset": "UTF-8"}, "Html": {"Data": "Data example", "Charset": "UTF-8"} } }'
效果示例
如果bash变量赋值为:
bash_val1="测试主题后缀" bash_val2="测试正文内容"
执行后输出结果为:
{ "Subject": { "Data": "Value 测试主题后缀", "Charset": "UTF-8" }, "Body": { "Text": { "Data": "Value 测试正文内容", "Charset": "UTF-8" }, "Html": { "Data": "Data example", "Charset": "UTF-8" } } }
内容的提问来源于stack exchange,提问作者hock
相关产品推荐
相关产品推荐

