将Bash逗号分隔的字符串值变量传递给jq arg过滤器

贾斯汀

我正在尝试使用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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章