【问题标题】:JQ filter returns 'false' when key is not hardcoded当密钥未硬编码时,JQ 过滤器返回“false”
【发布时间】:2021-10-11 06:45:28
【问题描述】:

当使用 JQ 测试键的值时,过滤器意外返回 false,而它原本应该返回 true

假设以下变量-

TAGS='{"kubernetes.io/cluster/my-cluster":"owned"}
CLUSTER_NAME="my-cluster"

当使用硬编码值测试$TAGS 时,过滤器会按预期返回true

echo $TAGS | jq '."kubernetes.io/cluster/my-cluster" == "owned"'

但是,在引入 clusterName 作为 JQ 参数后,过滤器现在返回 false

echo $TAGS | jq --arg clusterName $CLUSTER_NAME '."kubernetes.io/cluster/" + $clusterName == "owned"'

我首先想知道$CLUSTER_NAME 中的- 是否是问题所在,但删除它(并更新$TAGS 以匹配)会产生相同的结果。

我在过滤器中尝试了以下方法,所有这些都产生了相同的结果。

."kubernetes.io/cluster/" + "$clusterName"
."kubernetes.io/cluster/ + $clusterName"
."kubernetes.io/cluster/$clusterName"

如何修改过滤器以按预期工作?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    您可以使用字符串插值 (\()) docs 将该变量连接到其余变量,如下所示:

    '."kubernetes.io/cluster/\($clusterName)" == "owned"'
    
    echo $TAGS | jq --arg clusterName $CLUSTER_NAME '."kubernetes.io/cluster/\($clusterName)" == "owned"'
    

    在使用提供的变量进行测试时显示true


    也就是说,我建议使用 here-string (<<<) 代替 echo |,如下所示:

    $ TAGS='{"kubernetes.io/cluster/my-cluster":"owned"}'
    $ CLUSTER_NAME="my-cluster"
    $
    $ jq --arg clusterName $CLUSTER_NAME '."kubernetes.io/cluster/\($clusterName)" == "owned"' <<< "$TAGS"
    true
    $
    

    Can I pass a string variable to jq not the file?

    【讨论】:

    • 不应该初始化clusterName吗?这种缺失的初始化在 OP 的代码中也很奇怪。
    • 抱歉,我不太清楚您所说的初始化 clusterName 是什么意思。它在 BASH 中定义并使用 --arg 导入到 jq
    • 在您的代码中,我只看到分配给CLUSTER_NAME,但看不到分配给clusterName。当然,如果clusterName是父进程中设置的环境变量,那就没问题了。
    • 啊,我错过了单引号。现在我明白了。谢谢。
    • @0stone0 - 非常感谢,看来已经成功了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2015-01-18
    • 2013-12-30
    • 1970-01-01
    相关资源
    最近更新 更多