首页 > 解决方案 > 在变量中获取 curl 命令的输出

问题描述

我需要从云平台获取数据。导出数据的过程分为 2 步:

  1. 首先使用用户名/密码详细信息进行邮政呼叫。这将在响应中返回带有 jobid 的 xml 输出。
  2. 从第一个响应中获取jobid并使用这个jobid,连接它以获得一个新的url,然后使用这个新的url进行get调用(再次执行curl),然后我将在json响应中获取数据。

我做了什么: 我能够进行第一次 API 调用并获得 jobID。接下来,我将这个jobId连接起来以获取新的url并将完整的curl语句保存在一个变量中(让我们调用变量cmd_second_api_call)。这个变量 'cmd_second_api_call' 包含我需要执行的完整 curl 语句。所以我做了一个 out=$($cmd_second_api_call),因为我想执行第二个 curl 语句并将输出存储在一个变量中。

问题: 当我执行 out=$($cmd_second_api_call) 时,我看到 out 变量为空。我验证了 $cmd_second_api_call 实际上完美地输出了 curl 命令。如果我在命令提示符下执行 $cmd_second_api_call 的输出,我会看到输出。我在这里想念什么?如何在变量中获取 curl 输出?

谢谢!

r=$(curl -k -u user:password static_url -d <data I need to pass>)

jobid=$(echo $r | sed -n 's:.*<jobid>\(.*\)<\/jobid>.*:\1:p')

second_url="abc.com/${jobid}/result/ --get -d output=json"

cmd_second_api_call="curl -u user:password -k ${second_url}"

out=$($cmd_second_api_call)

echo $out

标签: unixcurloutput

解决方案


将命令放入变量或使用不带引号的变量可能很危险。
我建议

out=$(curl -u user:password -k ${second_url})
# or 
out=$(curl -u user:password -k abc.com/${jobid}/result/ --get -d output=json) 
# and
echo "$out"

不知何故,这sleep 5在两个curl电话之间都有帮助。您不会期望远程服务器在返回有效的 jobid 和启用该 jobid 的接口之间存在延迟。也许是某种“防御”,以防止使用随机 jobid 的未经授权的呼叫。


推荐阅读