2017-07-09 123 views
2

我試圖片在年底指數從殼體中的參數(bash)的傳遞JQ數組切片陣列:JQ:基於參數

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 

我懷疑這可能是用H做ow jq處理切片運算符[:]內的變量替換,但我的解決方法都不是我的嘗試,例如通過在花括號中包含變量名稱.arr[0:${eidx}],已工作。

回答

2
  1. 可以使用tonumber字符串轉換爲數字,如:

jq --arg eidx 1 '.arr[0:($eidx|tonumber)]' 
  • 如果你的JQ足夠近,可以使用--argjson代替--arg
  • jq --argjson eidx 1 '.arr[0:$eidx]' 
    
    +0

    --argjson爲我完成了這項工作 –

    1

    當通過--arg傳遞一個參數它被當作一個字符串,而不是一個int:

    --arg名稱值:

    該選項將作爲預定義的值的JQ程序變量。如果您使用--arg foo bar運行jq,則$ foo在程序中可用,並具有值「bar」。 請注意,該值將被視爲一個字符串,因此--arg foo 123會將$ foo綁定到「123」

    the docs(添加的重點)

    所以它似乎是你不能使用--arg通過在切片中使用的值。在這個例子中,你可以只使用外殼擴展,但:

    jq ".arr[0:$end_index]" obj.json 
    

    雙引號將有殼它傳遞給jq(雖然其他的擴張將發生之前擴大您的變量,所以一定要確保你的意思是他們發生

    +0

    感謝您指出的解釋爲字符串。 Shell擴展並不總是適用於更復雜的jq命令,這就是爲什麼我首先使用--arg –