gpt4 book ai didi

json - 验证 jq 和 bash 是否存在 json 字段?

转载 作者:行者123 更新时间:2023-11-29 09:03:09 25 4
gpt4 key购买 nike

我有一个脚本使用 jq 来解析 json 字符串 MESSAGE(从另一个应用程序读取)。同时 json 发生了变化,一个字段被拆分为 2 个字段:file_path 现在拆分为 folderfile。脚本正在读取 file_path,现在 folder 可能不存在,因此为了创建文件路径,我必须验证该字段是否存在。我在互联网上搜索了一段时间,并设法做到了:

echo $(echo $MESSAGE | jq .folder -r)$'/'$(echo $MESSAGE | jq .file -r)

if [ $MESSAGE | jq 'has(".folder")' -r ]
then
echo $(echo $MESSAGE | jq .folder -r)$'/'$(echo $MESSAGE | jq .file -r)
else
echo $(echo $MESSAGE | jq .file -r)
fi

其中 MESSAGE='{"folder":"FLDR","file":"fl"}'MESSAGE='{"file":"fl"}'

如果文件夹字段不存在,第一行打印 FLDR/flnull/fl。所以我想创建一个 if 来验证文件夹字段是否存在,但似乎我做错了,无法找出问题所在。输出是

bash: [: missing `]'
jq: ]: No such file or directory
null/fl

最佳答案

我会在 jq 过滤器中完成所有操作:

echo "$MESSAGE" | jq -r '[ .folder, .file ] | join("/")'

如果您想用 bash 来做(或学习如何在 bash 中做这类事情),两点:

  • Shell 变量在使用时几乎总是应该被引用(即 "$MESSAGE" 而不是 $MESSAGE)。如果您的 JSON 中的某个字符串包含 shell 元字符(例如 *)而您忘记这样做,您将遇到有趣的问题;该字符串将进行 shell 扩展(* 将扩展为当前工作目录中的文件列表)。
  • shell if 接受命令作为条件,并根据该命令的退出状态决定分支位置(如果退出状态为 0,则为 true ,否则为假)。您尝试使用的 [ 只是一个命令(test 的别名,请参阅 man test)并且没有任何特殊之处。<

因此,目标是构造一个命令,如果 JSON 对象具有 folder 属性,则该命令以 0 退出,否则为非零。 jq 有一个 -e 选项,如果最后的输出值不是 false,它会返回 0 >null 否则非零,所以我们可以写

if echo "$MESSAGE" | jq -e 'has("folder")' > /dev/null; then
echo "$MESSAGE" | jq -r '.folder + "/" + .file'
else
echo "$MESSAGE" | jq -r .file
fi

>/dev/null 位将输出从 jq 重定向到 /dev/null (它被忽略的地方),这样我们在控制台上看不到它。

关于json - 验证 jq 和 bash 是否存在 json 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com