我需要在解除服务时发现错误.响应可以是null一个字符串错误消息
error services-migration/foobar: Not found: services-migration/foobar
一切都很好,或有效的JSON.我想知道是否有办法jq简单地检查提供的字符串是否是有效的JSON.我可以检查字符串中的某些关键字,比如errorfe,但我正在寻找一个更强大的选项,例如.我得到一个true/false或1/0从jq.我正在查看jq有关SO 的文档和一些问题但是所有内容都是关于从JSON中查找和选择键值,但没有关于简单地验证字符串的内容.
更新:
我有这个:
result=$(some command)
Run Code Online (Sandbox Code Playgroud)
结果是字符串 error services-migration/foobar: Not found: services-migration/foobar
然后if语句:
if jq -e . >/dev/null 2>&1 <<<"$result"; then
echo "it catches it"
else
echo "it doesn't catch it"
fi
Run Code Online (Sandbox Code Playgroud)
它总是在else条款中结束.
Tom*_*ech 22
从手册:
-e/--exit-status:
如果最后一个输出值既不是false也不是null,则将jq的退出状态设置为0;如果最后一个输出值为false或null,则将jq的退出状态设置为0;如果没有生成有效结果,则将4的退出状态设置为4.通常,如果存在任何使用问题或系统错误,jq将退出2;如果存在jq程序编译错误,则退出3;如果运行jq程序,则退出0.
所以你可以使用:
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
Run Code Online (Sandbox Code Playgroud)
事实上,如果你不关心区分不同类型的错误,那么你可能会失去-e开关.在这种情况下,任何被认为是有效JSON(包括false/null)的东西都将被过滤器成功解析.,程序将成功终止,因此if将遵循分支.
这对我有用
echo $json_string | ./jq -e . >/dev/null 2>&1 | echo ${PIPESTATUS[1]}
Run Code Online (Sandbox Code Playgroud)
返回返回码:
然后,您可以通过进一步的代码评估返回代码.
jq下面的命令和解释尝试以最便宜的方式使用,就像验证 JSON 的方法一样。在我看来,有更适合于此的工具(例如 JSONLint),但如果您手头唯一的东西就是jq那么这就是我的贡献。
STDERR要验证 JSON 文件并仍然在输出中获取错误,jq您可以使用以下 bash 单行代码
jq -reM '""' <<<'<MAYBE_INVALID_JSON>' 1>/dev/null
Run Code Online (Sandbox Code Playgroud)
内容如下:
jq带标志执行:
-r输出原始值(无处理或格式化)-e0以大于出现错误时的代码退出-M不要对 JSON 进行着色第一个jq参数'""'输出空字符串,有效防止jq对 JSON 进行任何打印处理
<<<后面跟着的字符串称为“Here String”,基本上是告诉 bash 将字符串视为文件并将其传递给STDIN(作为命令的输入)。
请注意,您可以替换<<<'<MAYBE_INVALID_JSON>'为要验证的文件的路径,它仍然可以工作
然后将任何STDOUT输出(通常包含 JSON)重定向到/dev/null,有效地丢弃它
您还可以使用以下命令变得更有趣并在错误下方输出自定义消息:
jq -reM '""' <<<'<MAYBE_INVALID_JSON>' 1>/dev/null || ( exit_code="$?"; echo 'ERROR: Invalid JSON file. See errors above' 1>&2; exit "$exit_code" )
Run Code Online (Sandbox Code Playgroud)
其中添加的部分内容如下:
||意思是:如果上一个命令失败且退出代码非零,则运行以下命令(。这实际上是需要的,因为我们想使用原始命令的退出代码退出
exit_code环境变量设置为最后一个命令的退出代码$?echoexit带有原始命令退出代码的子 shell$exit_code