jq的--arg参数用法
--arg
这是最基本的参数
--arg name value
含义是定义变量$name的值为"value"。
注意这里的value是安装字符串处理的,所以即使是数字值,也是数字串,例如--arg v 123,那么$v=="123"。
举个例子:
$ echo '{"AA":"aa","BB":"bb"}' | jq --arg v XX '.BB=$v'
{
"AA": "aa",
"BB": "XX"
}
举一个数字的例子:
$ echo '{"AA":"aa","BB":"bb"}' | jq --arg v 123 '.CC=$v'
{
"AA": "aa",
"BB": "bb",
"CC": "123"
}
显然数字被按照字符串处理啦,这里没有别的办法只能使用类型转化:
$ echo '{"AA":"aa","BB":"bb"}' | jq --arg v 123 '.CC=($v|tonumber)'
{
"AA": "aa",
"BB": "bb",
"CC": 123
}
参数--arg最常用的场景也就是这里,试想上述例子,如果不用--arg如何替换字段"BB"的值呢:
J='{"AA":"aa","BB":"bb"}'
V="vv"
#echo ${J} | jq '.BB=$V'
echo ${J} | jq '.BB="'$V'"'
echo ${J} | jq --arg v ${V} '.BB=$v'
从词法表达式看使用--arg显得更为简洁。
使用多个参数
J='{"AA":"aa","BB":"bb"}'
V1="vv"
V2="ww"
echo ${J} | jq --arg v1 ${V1} --arg v2 ${V2} '.AA=$v1 | .BB=$v2'
参数--argjson
和--arg相比,差别就是--arg表示一个简单的字符串值,而--argjson表示一个json对象。
J='{"AA":"aa","BB":"bb"}'
A='{"XX":"xx","YY":1234}'
echo ${J} | jq --argjson a ${A} '.CC=$a'
# {
# "AA": "aa",
# "BB": "bb",
# "CC": {
# "XX": "xx",
# "YY": 1234
# }
}
echo ${J} | jq --argjson a ${A} '.CC=$a.YY'
# {
# "AA": "aa",
# "BB": "bb",
# "CC": 1234
# }
参数--slurpfile和--rawfile
表示从文件中读取参数,或者json文本,还是字符串文本;他们分别对应于参数--arg和--argjson。
其实--slurpfile对应于--argfile更直接,但是jq文档建议用--slurpfile,但我连这个单词什么意思都不认识呢:-( 。