如何通过文件传递jq命名参数以替代命令行指定?
优雅实现用JSON文件作为jq命名参数的方案
当然可行,完全不用靠生成CLI参数这种繁琐方式,用jq本身的功能就能优雅解决。下面给两种实用方案,既能替代命令行直接传--argjson参数,还能轻松切换不同参数文件:
方案一:命令行传入整个参数对象
用--argjson结合文件内容读取,把整个参数JSON文件作为单个对象传给jq脚本,之后在脚本里通过对象属性访问参数即可。
假设参数文件params.json内容为:
{ "foo": "bar", "baz": 123 }
运行命令示例:
# 等效于执行 jq --argjson foo '"bar"' --argjson baz 123 '你的脚本逻辑' jq --argjson params "$(cat params.json)" ' # 这里写你的jq脚本,用$params.foo代替原来的$foo,$params.baz代替$baz .output = $params.foo + "_" + ($params.baz | tostring) ' input.json
这种方式的好处是不用大幅修改原有脚本,只要把原来直接用的$foo改成$params.foo即可,切换参数文件只需要替换cat的目标文件名。
方案二:脚本内部直接读取参数文件(jq 1.6+支持)
如果不想在命令行里处理文件读取,可以在jq脚本里用fromfile()函数直接加载参数文件,还能通过命令行参数动态指定要加载的参数文件。
先写好jq脚本process.jq:
# 优先用命令行传入的参数文件名,默认用params.json $param_file = ($param_file // "params.json") # 加载参数文件 $params = fromfile($param_file) # 你的脚本逻辑示例 .result = "Foo值:\($params.foo),Baz值:\($params.baz)"
运行时用默认参数文件:
jq -f process.jq input.json
切换到其他参数文件(比如params_prod.json):
jq --arg param_file "params_prod.json" -f process.jq input.json
这种方式更灵活,脚本逻辑和参数加载分离,换参数文件只需要传一个文件名参数就行。
内容的提问来源于stack exchange,提问作者Jakub Bochenski
相关产品推荐
相关产品推荐

