I'm building a bash script that will read the response from an API and insert a value within a [] list (not {} array) if the value isn't present. Fake example response from API:
#response.json contains:
{
"foods": {
"menu": [
"tacos",
"spaghetti",
"pizza",
"chicken_florentine",
"bacon_cheeseburge",
"chow_mein",
"sushi",
"chocolate",
"whiskey"
]
}
}
The variable from my bash script is order="lasagna"
. If 'foods.menu[]'
contains $order
then do nothing, else insert $order
value into 'foods.menu[]'
.
Using bash variable order="lasagna"
which currently doesn't exist in 'foods.menu[]'
, the resulting json should be:
{
"foods": {
"menu": [
"tacos",
"spaghetti",
"pizza",
"chicken_florentine",
"bacon_cheeseburge",
"chow_mein",
"sushi",
"chocolate",
"whiskey",
"lasagna" <----
]
}
}
I started with trying a bash for
loop and variations of jq's if-then-else
, select
, and contains
but went down a rabbit hole. Any help is appreciated.
CodePudding user response:
You don't need a loop for that
order=lasagna
jq --arg order "$order" '.foods.menu |= if index($order) then . else . [$order] end' response.json
CodePudding user response:
Here's another way using the alternative operator //
to default to the array's length
for the item's index:
jq --arg order 'lasagna' '
(.foods.menu | .[index($order) // length]) = $order
' response.json