Shell 脚本,用于从 curl 读取响应并从 JSON 响应循环特定值



我正在创建一个shell脚本(.sh(,并尝试从REST调用的JSON响应中读取特定值。下面是我通过调用 Rest URL(GET( 获得的示例 json 响应

{"isTestRunning":false,"status":null}

这是我尝试在 shell 脚本中编码的逻辑。我对 shell 脚本完全陌生,发现很难根据我的要求编写脚本。 我该如何开始呢?如果你们中的任何人有文档链接也会很有帮助吗?

response = curl 'http://test-url/checkTestEnable'
for(till response.isTestRunning is true)
{
response = curl 'http://test-url/checkTestEnable'
if(response.isTestRunning is false){
//curl 'another url'
//break the loop.
}
}

我为此选择了jqjq就像 JSON 数据的 sed。

while [ "$(curl -sS -H 'Accept: application/json' 'http://test-url/checkTestEnable' |
jq '.isTestRunning')" = "true" ]; do
sleep 10
done
curl 'ANOTHER_URL'

如果jq不可用,您可以使用以下有点丑陋的正则表达式和sed

while [ "$(curl -sS -H 'Accept: application/json' 'http://test-url/checkTestEnable' |
sed -re 's/.*":(false|true),".*/1/')" = "true" ]; do
sleep 10
done
curl 'ANOTHER_URL'

顺便说一句:如果你可以创建shell脚本,那么你可以安装jq,它只是一个二进制文件。

很遗憾你不能安装jq,因为它确实是从shell处理JSON的最佳方式。 只要isTestRunningcurl返回的对象中唯一的布尔值,@JGK的sed解决方案就可以工作; 如果它发生了变化,你可以使sed表达式稍微复杂一点,以确保你得到正确的表达式, 但是使用正则表达式来解析 JSON 很快就会变得不守规矩。

可能还有其他选项,具体取决于系统上安装的内容。Python 通常附带其 JSON 模块,例如:

isTestRunning() { 
curl -sS -H 'Accept: application/json' 'http://test-url/checkTestEnable' |
python -c 'import json,sys;print(json.load(sys.stdin)["isTestRunning"])' |
grep -q True
}
while isTestRunning; do 
sleep 10
done

正如@JGK所建议的那样,下面的那个对我就像魔术一样对我有用。非常感谢@JGK!

while [ "$(curl -sS -H 'Accept: application/json' 'http://test-url/checkTestEnable' |
sed -re 's/.*":(false|true),".*/1/')" = "true" ]; do
sleep 10
done
curl 'ANOTHER_URL'

最新更新