Je souhaite détecter une erreur en fonction d'un champ JSON de message d'erreur vide ou non vide. J'utilise jq pour trancher le membre, mais j'ai alors beaucoup de mal à l'évaluer dans mon bash "si".bash JSON avec jq - comment vérifier la présence de membres JSON vides?
Je dispose d'un fichier JSON référencé par ma variable d'entrée de $ qui ne possède un membre errMsg, mais comme une chaîne vide (notez que mon invite CLI est ~ $):
~$ echo $(jq "." $input)
{ "projectCode": "145", "fullCode": "1", "errMsg": "" }
récupérer le champ errMsg dans ce cas donne correctement une chaîne vide:
~$ err=$(jq ".errMsg" $input)
~$ echo $err
""
problème: tester cette variable semble impossible:
~$ if [ $err = "" ]; then echo EMPTY; else echo CONTENT; fi
CONTENT
J'ai excité le VIDE comme $ err a juste montré "". Vérification inverse:
~$ if [ $err != "" ]; then echo EMPTY; else echo CONTENT; fi
EMPTY
donc $ err est apparemment pas "", même si l'écho des rendements err de $ ""? Comment cela peut-il être? Quelle caractéristique de bash suis-je manquant ici?
Quoi qu'il en soit, laisse essayer avec un JSON non vide (après avoir modifié le contenu d'entrée de $):
~$ echo $(jq "." $input)
{ "projectCode": "145", "fullCode": "1", "errMsg": "not empty" }
~$ echo $err
"not empty"
~$ if [ $err != "" ]; then echo EMPTY; else echo CONTENT; fi
bash: syntax error near unexpected token `then'
correct, puis masquer comme ceci:
~$ if [ "$err" != "" ]; then echo EMPTY; else echo CONTENT; fi
bash: syntax error near unexpected token `then'
Je suppose qu'il trouve un deuxième jeton après "pas" et ne l'aime pas. Après beaucoup de recherches je trouver cette solution vraiment illisible qui semble fonctionner:
~$ val=$(sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$err" | sed -e 's/\s.*$//')
~$ if [ "$val" = "" ]; then echo "NO ERROR"; else echo "ERROR"; fi
NO ERROR
cela fonctionne aussi pour les membres de errmsg non vides. S'il vous plaît, il doit y avoir une solution simple et élégante à cela.
'[$ err =" "]' n'est pas sûr code bash; rien à voir avec 'jq'. Si 'err' est vide, alors il exécute' [= ""] ', ce qui n'est pas une syntaxe valide. Vous avez besoin de '[" $ err "=" "]'. –
Comme pour '' 'if [" $ err "! =" "]; alors écho VIDE; else echo CONTENU; fi''' - vraiment, vraiment * n'est pas * une erreur de syntaxe (bien que le '! =' signifie qu'il y a une erreur de logique). Voyez-le fonctionner correctement sur https://ideone.com/CblHNK –
... si vous pouviez fournir un [mcve] sous forme de code, d'autres personnes pourraient copier-coller pour reproduire ce bug particulier (idéalement, un reproducteur testé pour travailler sur ideone ou un autre bac à sable tiers impartial), je serais très intéressé de le voir. –