我正在从bash
脚本对服务器进行curl
调用。在响应中,我想使用jq
提取一些数据。但是,我从jq
jq: error (at <stdin>:1): Cannot index number with string "_links"
脚本部分:
#!/bin/bash
set -e
keyword="config"
response=$(curl --location "${HEADERS[@]}" -s -w "%{http_code}n" -X GET "$url")
if echo ${response} | grep "$keyword" ; then
extract=$(jq -r "._links" <<< "${response}")
echo "$extract"
fi
实际响应:
{
"config": {
"polling": {
"sleep": "00:20:00"
}
},
"_links": {
"deployment": {
"href": "https://www.example.com"
},
"configData": {
"href": "https://www.example.com/configData"
}
}
}
200
谁能告诉我这里出了什么问题?Thanks in advance
p。S:我在Ubuntu上测试(在WSL上)。如果缺少任何信息请告诉我
如果你的输入有一个JSON文档后面跟着其他内容,你可以让你的jq只读取一个输入:
extract=$(jq -n "input | ._links" <<<"$response")
-n
告诉jq默认不读取任何内容;-n
,只使用一次,告诉它读一个东西。
您还可以提取_links
属性和HTTP状态码,只需调用一次jq:
IFS=$'n' read -r -d '' extract http_code < <(
jq -nc '
input as $full_doc | input as $status_code |
(($full_doc | ._links), $status_code)
' <<<"$response" && printf ' '
)
使用read -d ''
会导致read
如果在输入的末尾没有找到NUL就失败,如果jq
报告成功,&& printf ' '
会在进程替换的输出的末尾添加一个NUL。
您的变量response
不包含您所显示的内容。变量的实际内容是:
{
"config": {
"polling": {
"sleep": "00:20:00"
}
},
"_links": {
"deployment": {
"href": "https://www.example.com"
},
"configData": {
"href": "https://www.example.com/configData"
}
}
}
200
该200
被添加到输出中,因为您调用了curl -w "%{http_code}n"
,它将向输出中添加响应状态码。如果您计划处理输出,请去掉-w
选项(您没有使用jq解析它,因此不需要它)。
如果您需要200
作为输出的一部分,那么您可以指示jq将完整的输入读入单个数组中,并且只对第一个项目进行操作:
jq -s 'first._link' <<< "$response"
但在这种情况下,我建议使用Charles Duffy的答案,并将-n
与input
结合使用。