用于从curl中阅读响应并在JSON响应中的特定值上循环的Shell脚本

92dk7w1h  于 2023-10-23  发布在  Shell
关注(0)|答案(3)|浏览(106)

我正在创建一个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.
   }

}
sqyvllje

sqyvllje1#

我会选择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,它只是一个单一的二进制文件。

f8rj6qna

f8rj6qna2#

很遗憾你不能安装jq,因为它确实是从shell处理JSON的最佳方式。只要curl返回的对象中只有isTestRunning是布尔值,@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
icnyk63a

icnyk63a3#

正如@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'

相关问题