我想根据错误消息JSON字段为空或非空来检测错误。我使用jq来分割成员,但是在我的bash“if”中评估它时遇到了很大的麻烦。bash JSON与jq - 如何检查空的JSON成员?
我有我的变量$输入里面确实有一个ERRMSG成员引用的JSON文件,但作为一个空字符串(请注意,我的命令行提示符为〜$):
~$ echo $(jq "." $input)
{ "projectCode": "145", "fullCode": "1", "errMsg": "" }
检索在ERRMSG场这种情况下,适当地产生一个空字符串:
~$ err=$(jq ".errMsg" $input)
~$ echo $err
""
问题:测试变量似乎是不可能的:
~$ if [ $err = "" ]; then echo EMPTY; else echo CONTENT; fi
CONTENT
由于$ err刚刚显示“”,我意识到EMPTY。检查其他方式:
~$ if [ $err != "" ]; then echo EMPTY; else echo CONTENT; fi
EMPTY
所以$ err显然不是“”,即使echo $ err yield“”? 这怎么可能?我在这里错过了什么bash功能?
无论如何,让我们尝试用一个非空的JSON(改变$输入内容后):
~$ 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'
好,然后屏蔽这样的:
~$ if [ "$err" != "" ]; then echo EMPTY; else echo CONTENT; fi
bash: syntax error near unexpected token `then'
我想找到一个第二个标记在“不”之后并且不喜欢它。 经过大量的研究我发现这似乎工作真正不可读的解决方案:
~$ val=$(sed "s/^\(\"\)\(.*\)\1\$/\2/g" <<<"$err" | sed -e 's/\s.*$//')
~$ if [ "$val" = "" ]; then echo "NO ERROR"; else echo "ERROR"; fi
NO ERROR
它也适用于非空ERRMSG成员。请,那里必须是一个简单而优雅的解决方案。
'[$ err =“”]'不安全的bash代码;与'jq'无关。如果'err'为空,则运行'[=“”]',这是无效的语法。你需要'[“$ err”=“”]'。 –
至于'''if [“$ err”!=“”];然后回显EMPTY;其他回声CONTENT; fi''' - 它真的,真的*不是*语法错误(尽管'!='意味着有逻辑错误)。看到它正确运行在https://ideone.com/CblHNK –
...如果你可以提供[mcve]的代码形式,其他人可以复制和粘贴以重现该特定的错误(理想情况下,测试的复制器在ideone或另一个不偏不倚的第三方沙箱上工作),我很乐意看到它。 –