【问题标题】:jq: error: syntax error, unexpected if, while checking for a object to be present and if not the adding default valuejq:错误:语法错误,如果在检查对象是否存在时出现意外,如果不存在则添加默认值
【发布时间】:2021-12-05 13:20:50
【问题描述】:

得到错误

jq: error: syntax error, unexpected if (Unix shell quoting issues?) at <top-level> while parsing kubernetes kubectl command,
kubectl get pv -o=json | jq -c '.items[] | {name: .metadata.name, claimName: .spec | if has("claimRef") then .claimRef.name else empty end }'

尝试获取具有 PVC 的 PV,如果没有 PVC,则可以为空。 如果有其他空或为空,则它会使用名称及其各自的 PVC 的映射。

以下是 jq 命令的示例输入或命令 kubectl get pv -o=json 的输出

{
    "apiVersion": "v1",
    "items": [{
            "apiVersion": "v1",
            "kind": "PersistentVolume",
            "metadata": {
                "annotations": {
                    "meta.helm.sh/release-name": "",
                    "meta.helm.sh/release-namespace": ""
                },
                "creationTimestamp": "",
                "finalizers": [
                    ""
                ],
                "labels": {
                    "app.kubernetes.io/managed-by": ""
                },
                "name": "",
                "resourceVersion": "",
                "uid": ""
            },
            "spec": {
                "accessModes": [
                    "ReadWriteMany"
                ],
                "capacity": {
                    "storage": ""
                },
                "claimRef": {
                    "apiVersion": "",
                    "kind": "",
                    "name": "",
                    "namespace": "",
                    "resourceVersion": "",
                    "uid": ""
                },
                "csi": {
                    "driver": "",
                    "volumeHandle": ""
                },
                "persistentVolumeReclaimPolicy": "",
                "volumeMode": ""
            },
            "status": {
                "phase": ""
            }
        },
        {
            "apiVersion": "v1",
            "kind": "PersistentVolume",
            "metadata": {
                "annotations": {
                    "meta.helm.sh/release-name": "",
                    "meta.helm.sh/release-namespace": ""
                },
                "creationTimestamp": "",
                "finalizers": [
                    ""
                ],
                "labels": {
                    "app.kubernetes.io/managed-by": ""
                },
                "name": "",
                "resourceVersion": "",
                "uid": ""
            },
            "spec": {
                "accessModes": [
                    "ReadWriteMany"
                ],
                "capacity": {
                    "storage": ""
                },
                "claimRef": {
                    "apiVersion": "",
                    "kind": "",
                    "name": "",
                    "namespace": "",
                    "resourceVersion": "",
                    "uid": ""
                },
                "csi": {
                    "driver": "",
                    "volumeHandle": ""
                },
                "persistentVolumeReclaimPolicy": "",
                "volumeMode": ""
            },
            "status": {
                "phase": ""
            }
        }
    ],
    "kind": "List",
    "metadata": {
        "resourceVersion": "",
        "selfLink": ""
    }
}

为了数据安全已删除数据并仅保留密钥 请帮忙

【问题讨论】:

    标签: json shell kubernetes jq kubectl


    【解决方案1】:

    claimName 字段的值周围加上括号:

    {
      name: .metadata.name,
      claimName: (.spec | if has("claimRef") then .claimRef.name else empty end)
    }
    

    根据您对示例的简化程度,您可以考虑将if 语句简化为:

    {
      name: .metadata.name,
      claimName: (.spec.claimRef.name? // empty)
    }
    

    请注意,在这两种情况下,不仅是.claimName,而且如果相应的测试失败,整个对象都会消失。

    【讨论】:

    • 感谢@pmf 提供的解决方案。如果 .spec.claimRef 不存在,如何在 claimName 中有空对象。
    • 如您所说,将else 分支设为“空对象”,即{}: {name: .metadata.name} + (.spec | if has("claimRef") then {claimName: .claimRef.name} else {} end)
    • 伟大的@pmf,这解决了问题,谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多