Je dois attraper une erreur en levant un service. La réponse peut être null
, un message d'erreur tel que
error services-migration/foobar: Not found: services-migration/foobar
ou un JSON valide lorsque tout va bien. Je me demandais s'il était possible avec jq
de vérifier simplement si la chaîne fournie est un JSON valide. Je pourrais souvent vérifier la chaîne pour des mots-clés tels que error
f.e., mais je cherche une option plus robuste, par exemple. J'ai un true/false
ou 1/0
de jq. Je parcourais la documentation de jq
ainsi que quelques questions ici sur SO), mais tout était axé sur la recherche et la sélection de valeurs-clés dans un JSON, mais rien sur la validation d'un chaîne.
MISE À JOUR:
J'ai ça:
result=$(some command)
dont le résultat est la chaîne error services-migration/foobar: Not found: services-migration/foobar
Et puis la déclaration if:
if jq -e . >/dev/null 2>&1 <<<"$result"; then
echo "it catches it"
else
echo "it doesn't catch it"
fi
Et cela finit toujours par la clause else
.
Du manuel:
-e/--exit-status:
Définit le statut de sortie de jq sur 0 si les dernières valeurs de sortie n'étaient ni fausses ni nulles, 1 si la dernière valeur de sortie était faux ou nulles ou 4 si aucun résultat valide n'a été produit. Normalement, jq se termine avec 2 en cas de problème d'utilisation ou d'erreur système, 3 en cas d'erreur de compilation du programme jq ou 0 en cas d'exécution du programme jq.
Pour que vous puissiez utiliser:
if jq -e . >/dev/null 2>&1 <<<"$json_string"; then
echo "Parsed JSON successfully and got something other than false/null"
else
echo "Failed to parse JSON, or got false/null"
fi
En fait, si vous ne vous souciez pas de distinguer les différents types d’erreur, vous pouvez simplement perdre le -e
_ commutateur. Dans ce cas, tout ce qui est considéré comme valide JSON (y compris false/null) sera analysé avec succès par le filtre .
et le programme se terminera avec succès, donc la branche if
sera suivie.
Cela fonctionne pour moi
echo $json_string | ./jq -e . >/dev/null 2>&1 | echo ${PIPESTATUS[1]}
qui retourne le code retour:
Ensuite, vous pouvez évaluer le code de retour par un code supplémentaire.