我正在构建一个bash脚本,该脚本将从API读取响应,并在[]列表(而不是{}数组(中插入一个值(如果该值不存在(。API的虚假示例响应:
#response.json contains:
{
"foods": {
"menu": [
"tacos",
"spaghetti",
"pizza",
"chicken_florentine",
"bacon_cheeseburge",
"chow_mein",
"sushi",
"chocolate",
"whiskey"
]
}
}
我的bash脚本中的变量是order="lasagna"
。如果'foods.menu[]'
包含$order
,则不执行任何操作,否则将$order
值插入到'foods.menu[]'
中。
使用目前'foods.menu[]'
中不存在的bash变量order="lasagna"
,得到的json应该是:
{
"foods": {
"menu": [
"tacos",
"spaghetti",
"pizza",
"chicken_florentine",
"bacon_cheeseburge",
"chow_mein",
"sushi",
"chocolate",
"whiskey",
"lasagna" <----
]
}
}
我开始尝试bashfor
循环和jq的if-then-else
、select
和contains
的变体,但失败了。感谢您的帮助。
您不需要的循环
jq --arg order lasagna '.foods.menu |= if index($order) then . else . + [$order] end' response.json
但你可能需要一个插入多个订单
jq 'reduce $ARGS.positional[] as $order (.;
.foods.menu |= if index($order) then . else . + [$order] end
)' response.json --args apple banana sushi
我不知道这是否符合任何不言而喻的要求。
无论如何添加项目,然后unique
结果:
echo "$result" | jq --arg order pizza '.foods.menu |= (. + [$order] | unique)'
{
"foods": {
"menu": [
"bacon_cheeseburge",
"chicken_florentine",
"chocolate",
"chow_mein",
"pizza",
"spaghetti",
"sushi",
"tacos",
"whiskey"
]
}
}
对生成的数组进行排序。如果输入中有任何重复项,则这些重复项将消失。
以下是另一种使用替代运算符//
默认为数组的length
作为项索引的方法:
jq --arg order 'lasagna' '
(.foods.menu | .[index($order) // length]) = $order
' response.json
以相同方式添加项目列表:
jq '.foods.menu |= reduce $ARGS.positional[] as $order (.;
.[index($order) // length] = $order
)' response.json --args 'lasagna' 'sushi' 'milk'