我有一个看起来像下面这样的json文件:
{
"items": [
{
"id": "some_id_1",
"name": "job_get_re_Log",
"type": "standard",
"workspace": {
"id": "some_id_2",
"name": "Shared",
"description": "",
"type": "custom",
"environment": {
"id": "some_id_3",
"name": "DEV"
}
}
}
]
}
为了获取id(some_id_1),我运行以下命令:
name="job_get_re_log"
workspace="Shared"
environment="DEV"
id=$(echo $jsonFile | jq -r ".items[] | select(.name == \"$name\" and .workspace.name == \"$workspace\" and .workspace.environment.name == \"$environment\").id")
echo "$id"
正如您所看到的,变量名为“job_get_re_log”,但在JSON中的名称为“job_get_re_Log”(大写L)。这最终会失败并返回空值,因为它正在寻找一个完全匹配。
我该如何修改选择命令以进行比较而不考虑大小写(不区分大小写)?
echo $jsonFile
本身就有 bug;如果你的文件包含"name": " * "
,那么*
将被替换为当前目录中文件名的列表。始终引用您的扩展:echo "$jsonFile"
。 - Charles Duffyecho
版本即使没有-e
也会尝试展开反斜杠;当设置了posix
和xpg_echo
运行时标志时,bash 内置版本也是如此。因此,当您想要确保数据被准确表示时,最好完全避免使用echo
,而改用类似printf '%s\n' "$jsonFile"
的东西。 - Charles Duffyjq --arg name“$name”--arg environment“$environment”
传递$name
和$environment
,以使值与代码分离; 这样就不能使用恶意名称进行注入攻击; 为此,--arg name "${name,,}"
与支持该扩展的新版本bash一起使用,您只需要将.name
转换为小写,而不是$name
在jq中) - Charles Duffy