Jav*_*per 2 bash shell json sh jq
我运行curl命令$(curl -i -o - --silent -X GET --cert "${CERT}" --key "${KEY}" "$some_url")并将响应保存在变量响应中.$ {response}如下所示
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 34
Connection: keep-alive
Keep-Alive: timeout=5
X-XSS-Protection: 1;
{"status":"running","details":"0"}
Run Code Online (Sandbox Code Playgroud)
我想解析JSON {"status":"running","details":"0"}并将'running'和'details'分配给两个不同的变量,我可以在这两个变量中打印状态和详细信息.此外,如果状态等于错误,则脚本应退出.我正在做以下任务来完成任务 -
status1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.status')
details1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.details')
echo "Status: ${status1}"
echo "Details: ${details1}"
if [[ $status1 == 'error' ]]; then
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
我想要只做一次,而不是两次解析JSON.因此,我想结合以下几行,但仍然将状态和细节分配给两个单独的变量 -
status1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.status')
details1=$(echo "${response}" | awk '/^{.*}$/' | jq -r '.details')
Run Code Online (Sandbox Code Playgroud)
首先,停止使用-i参数curl.这消除了awk(或事后的任何其他头部修剪)的需要.
第二:
{
IFS= read -r -d '' status1
IFS= read -r -d '' details1
} < <(jq -r '.status + "\u0000" + .details + "\u0000"' <<<"$response")
Run Code Online (Sandbox Code Playgroud)
使用NUL作为分隔符的优点是它是唯一的字符,不能出现在C风格字符串的值中(这是shell变量值的存储方式).