我正在尝试在jq中对数组进行切片,其中结束索引作为shell中的参数传递(bash):
end_index=7
cat obj.json | jq --arg eidx $end_index, '.arr[0:$eidx]'
当索引是硬编码时,这可以正常工作
cat obj.json | jq '.arr[0:7]'
但是在顶部的示例中,我收到错误消息
jq: error (at <stdin>:0): Start and end indices of an array slice must be numbers
我怀疑这可能与jq如何处理切片操作符[:]
中的变量替换有关,但我没有尝试解决问题,例如通过将变量名括在花括号.arr[0:${eidx}]
中,已经有效。
答案 0 :(得分:2)
tonumber
将字符串转换为数字,如:
jq --arg eidx 1 '.arr[0:($eidx|tonumber)]'
--argjson
代替--arg
:
jq --argjson eidx 1 '.arr[0:$eidx]'
答案 1 :(得分:1)
当您通过--arg
传递参数时,它被视为字符串,而不是int:
- arg名称值:
此选项将值作为预定义变量传递给jq程序。如果你使用--arg foo bar运行jq,那么$ foo在程序中可用并且值为&#34; bar&#34;。 请注意,值将被视为字符串,因此--arg foo 123会将$ foo绑定到&#34; 123&#34; 。
来自the docs(重点补充)
因此,您似乎无法使用--arg
传递要在切片中使用的值。在此示例中,您可以使用shell扩展:
jq ".arr[0:$end_index]" obj.json
双引号将使shell扩展您的变量,然后将其传递给jq
(虽然会发生其他扩展,所以请确保您的意思发生。