提问人:rosaLux161 提问时间:11/15/2023 最后编辑:Léa GrisrosaLux161 更新时间:11/16/2023 访问量:57
使用 jq 检查 GitLab-CI 中是否存在密钥
Checking for presence of keys in GitLab-CI with jq
问:
我正在尝试分析 GitLab-CI 中的一个变量,看看是否有两个键,以及一个值是否具有某个值。
我现在的看起来像这样:
if [[ $(echo $TRIGGER_PAYLOAD | jq -e '.changes.title.previous and .changes.title.current and .object_attributes.detailed_merge_status == "mergeable"') ]]; then
echo 'Do something'
fi
我已经尝试了很多东西,包括 select(),但现在我不知道该怎么做。
我刚刚为此创建了一个最小的示例:
set -x
payload="{\"object_attributes\": {\"detailed_merge_status\": \"draft_status\"},\"changes\": {}}"
echo $(echo $payload | jq -r .)
if jq -e '.changes.title.previous and .changes.title.current and .object_attributes.detailed_merge_status == "mergeable"' <<<"$payload"; then
echo "true"
else
echo "false"
fi
这个有效,反之亦然:
set -x
payload="{\"changes\": {\"title\": {\"previous\": \"test\", \"current\": \"test\"}},\"object_attributes\": {\"detailed_merge_status\": \"mergeable\"}}"
echo $(echo $payload | jq -r .)
if jq -e '.changes.title.previous and .changes.title.current and .object_attributes.detailed_merge_status == "mergeable"' <<<"$payload"; then
echo "true"
else
echo "false"
fi
如果我现在使用实际有效负载而不是虚拟 JSON,它就不能再工作了。而 jq 在 .key.key 上的简单查询适用于所有值。
$ if jq -e '.changes.title.previous and .changes.title.current and .object_attributes.detailed_merge_status == "mergeable"' <<<"$TRIGGER_PAYLOAD"; then # collapsed multi-line command
++ echo '$ if jq -e '\''.changes.title.previous and .changes.title.current and .object_attributes.detailed_merge_status == "mergeable"'\'' <<<"$TRIGGER_PAYLOAD"; then # collapsed multi-line command'
++ jq -e '.changes.title.previous and .changes.title.current and .object_attributes.detailed_merge_status == "mergeable"'
parse error: Invalid numeric literal at line 2, column 0
++ echo false
false
答:
2赞
Léa Gris
11/16/2023
#1
测试命令的返回状态时,不使用括号测试,而是直接使用命令 (*1)。
以下是执行测试的方法:
#!/usr/bin/env bash
# Testing data
triggerPayload='
{
"changes": {
"title": {
"previous": "test",
"current": "test"
}
},
"object_attributes": {
"detailed_merge_status": "mergeable"
}
}
'
# shellcheck disable=SC2016 # Does not expand shell expressions
jqFilter='
$j | (
.changes.title.previous and
.changes.title.current and
.object_attributes.detailed_merge_status == "mergeable"
)'
if jq --exit-status --null-input --argjson j "$triggerPayload" "$jqFilter" >/dev/null; then
echo 'Do something'
fi
笔记:
- or 实际上是一个 shell 命令,它接受测试参数,其中最后一个参数必须分别是 or。
[
[[
]
]]
上一个:如何按其他数组中的值过滤元素
评论
set -x
)echo
echo
echo -e
-e
jq -n '$ENV.TRIGGER_PAYLOAD | ...'
-n
$ENV
-e