尝试理解 Bash 中的一些奇怪行为。
我正在使用 CLI 包装器查询 API(databricks api),因此 API 请求通过 CLI 格式的命令发送。我正在使用 Bash 发送这些 CLI 命令。
我的命令中的“-o json”请求获取 JSON 格式的响应。大多数时候,您会得到一个常规的 JSON,就像直接查询 API 一样。然而,有时您会得到一个空响应,CLI 将其作为字符串文字“null”返回。
确切的命令是
databricks jobs list --name MyJobName -o json
。当我在 Mac 上运行它时(指向相同的 API 和相同的作业名称),我得到“null”结果,如下所示:
(base) % JOB_IF_EXISTS=$(databricks jobs list --name "$JOB_NAME" -o json)
(base) % echo "$JOB_IF_EXISTS"
null
但是,当我在 Bash 中运行它时,我得到一个空数组,格式为空格。这意味着我必须将其解析为数组而不是字符串,并且我不能使用标准的“-z”来检查它是否为空。
这就是我的 bash 代码的样子:
# Check if the job exists
echo "Finding job if exists..."
JOB_IF_EXISTS=$(databricks jobs list --name "$JOB_NAME" -o json)
echo "JOB_IF_EXISTS: $JOB_IF_EXISTS"
这就是我的日志中打印的内容:
Finding job if exists...
JOB_IF_EXISTS: [
]
谁能解释一下这是怎么回事?我的字符串文字“null”是否被解析为数组?为什么会这样?
问题原来是
null
输出来自过时的 databricks
版本。更新它会使运行命令在两种环境中返回一个空数组。
在这种情况下,找出设置之间的不同总是一个好主意 - 我假设 Mac 上使用的 shell 是
zsh
而不是 bash
,但这不应该成为一个问题在这种情况下存在差异,因此接下来要检查的显然是产生不同输出的工具的版本。
作为后续操作,要检查 shell 中的 JSON 数组是否为空,我将转向
jq
:
# For bash and zsh, not sh
if [[ "$(jq length <<<"$JOB_IF_EXISTS")" -eq 0 ]]; then
# do something if non-empty
else
# do something if empty
fi