将Bash逗号分隔字符串值变量传递给jq arg筛选器

将Bash逗号分隔字符串值变量传递给jq arg筛选器,bash,jq,github-actions,Bash,Jq,Github Actions,我试图使用jq和基于Bash脚本中的动态值列表的过滤器从json文件中过滤数据 以下jq命令本身工作: jq -r '.[] | select(.name==("value1","value2"))' file.json 在Bash中,如果我将变量设置为单个值并将其传入,则以下命令有效 testValue="value1" result=$(jq -r --arg TESTVALUE "$testValue" '.

我试图使用jq和基于Bash脚本中的动态值列表的过滤器从json文件中过滤数据

以下jq命令本身工作:

jq -r '.[] | select(.name==("value1","value2"))' file.json
在Bash中,如果我将变量设置为单个值并将其传入,则以下命令有效

testValue="value1"
result=$(jq -r --arg TESTVALUE "$testValue" '.[] | select(.name==($TESTVALUE))' file.json)
echo "$result"
如果我将变量设置为逗号分隔的值列表并将其传入,则不会返回任何结果

testValues="\"value1\", \"value2\""
result=$(jq -r --arg TESTVALUES "$testValues" '.[] | select(.name==($TESTVALUES))' file.json)
echo "$result"
我是bash脚本编写的新手,因此我确信在如何解释变量方面缺少了一些简单的东西。我还包括了下面的file.json

[
    {
        "name": "value1",
        "test": "blah1"
    },
    {
        "name": "value2",
        "test": "blah2"
    }
]
--arg
会将您的值视为文字字符串,因此引号和逗号不会产生任何效果

您可以将列表格式化为有效的JSON列表,并使用
--argjson

testValues='[ "value1", "value2" ]'
jq --argjson TESTVALUES "$testValues" '.[] | select(.name==($TESTVALUES[]))' file.json
或者更好,指定一些分隔符,让jq将字符串拆分,这样就不必担心JSON转义:

testValues='value1,value2'
jq --arg TESTVALUES "$testValues" '.[] | select(.name==($TESTVALUES | split(",")[]))' file.json

--arg
的全部要点是将内容作为数据传递,这样就不可能将其误解为代码或语法……而当添加引号和逗号时,这些都是语法……如果要传递列表,则传递实际列表--使用
--argjson
,然后重写查询以使用相同的数据。(当您发送JSON而不是原始字符串数据作为输出时,不要使用
-r
)!对于现在回答问题的人和将来遇到此问题的读者来说,它使一切都变得更容易。这非常有效!感谢您提供的解决方案,也感谢您提供了两种不同的方法来完成此任务。