jq
не имеет никаких проблем с обратными галочками в литеральных значениях. Вы можете видеть это следующим образом:
$ jq '.value' <<<'{"otherKey": "`otherValue`", "value": "desired value `with backticks`"}'
"desired value `with backticks`"
Что касается кода, приведенного в вопросе, то он сильно усложнен. Вместо того, чтобы разбираться в том, что может быть не так, рассмотрите следующую замену (которая вообще не должна читать count
и вызывает jq
только один раз):
# Aside: Using all-caps names is bad practice. Don't do this.
APINAME=SwaggerPetstore
APIVERSION=1.0.0
getAPIId() {
[[ $1 ]] || { echo 'Usage: getAPIId "$json"' >&2; return 1; }
jq -er \
--arg target_name "$APINAME" \
--arg target_version "$APIVERSION" '
.list[] |
select(.name == $target_name) |
select(.version == $target_version) |
.id' <<<"$1"
}
... возвращается, когда вызывается следующим образом:
s='{
"count": 1,
"next": "",
"previous": "",
"list": [
{
"id": "6d2822e5-a90d-4738-b7b7-ef7d7848cb48",
"name": "SwaggerPetstore",
"description": "`special key`",
"context": "/v2",
"version": "1.0.0",
"provider": "admin",
"status": "CREATED",
"thumbnailUri": null
}
],
"pagination": {
"total": 1,
"offset": 0,
"limit": 25
}
}'
getAPIId "$s"; echo "Exit status is $?" >&2
... правильный результат:
6d2822e5-a90d-4738-b7b7-ef7d7848cb48
Exit status is 0
... тогда как, если мы запустим его снова с неверным именем или версией для поиска:
APINAME=NotFound getAPIId "$s"; echo "Exit status is $?" >&2
... правильно отражает это:
Exit status is 4