skip to Main Content

I’m scripting in bash to edit a json template to replace some field values with arguments to my script, and trying to use jq to do the editing. My code is not replacing the –arg with the value of the argument, but the literal text of the argument name.

My template contains:

{
"name":""
}

My jq code:

jq --arg ad "192.168.5.5" -r '.name = "Addr $ad"' address.tmpl

This outputs:

{
    "name": "Addr $ad"
}

Or, if I remove the double-quotes

jq --arg ad "192.168.5.5" -r '.name = Addr $ad' address.tmpl

I get

jq: error: syntax error, unexpected '$', expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.name = Addr $ad
jq: 1 compile error

According to all that I have read, this should work. What am I doing wrong/how do I fix this????

OS = debian 10

2

Answers


  1. jq --arg ad 192.168.5.5 -r '.name = "Addr " + $ad' address.tmpl
    

    $ad will be expanded by the shell if it is not not hard quoted. In jq, you can use string interpolation "Addr ($ad)", or concatenation (as above), which I find slightly more readable.

    Login or Signup to reply.
  2. In the jq manual, search for "String interpolation"

    jq --arg ad "192.168.5.5" -r '.name = "Addr ($ad)"'
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search