【问题标题】:How to use variable for URL inside cURL GET command如何在 cURL GET 命令中使用 URL 变量
【发布时间】:2019-10-10 20:00:57
【问题描述】:

我正在尝试从 Elasticsearch 索引的 bash 脚本中的 cURL GET 命令获取特定的 json 字段。为此,我设置了一个脚本来将变量传递给 cURL 命令。对这些值进行硬编码会给出正确的响应,因此我只需要弄清楚如何使用变量,以便针对不同的目的获得不同的响应。

这是期望的结果和当前的工作命令:

docs=`curl -k -u admin:hunter1 -HContent-Type:application/json -X GET 'https://10.10.15.15:9200/logstash-linux-pci-2019.03.15/_stats' | jq '._all.primaries.docs.count'`
echo "The document count is "$docs

文档数为 183,283,999

我正在从一个可能看起来像这样的文本文件中导入逐行索引:

list.txt

logstash-linux-pci-2019.03.15
logstash-linux-pci-2019.03.16
logstash-linux-pci-2019.03.17
logstash-linux-pci-2019.03.18

我需要将一个 ip 变量与这些 ^ 一起放入 curl 命令中:

reindex.sh

user='admin'
pass='hunter1'
ip='https://10.10.15.15:9200'
indexList=(`cat "list.txt"`)

for index in "${indexList[@]}"
do
    echo "Reindexing: "$index
    docs=`curl -k -u $user:$pass -HContent-Type:application/json -X GET '$ip/$index/_stats' | jq '._all.primaries.docs.count'`
    echo "index "$index" has a doc count of "$docs
done
echo "Complete!"

在上面的例子中唯一不起作用的是....GET '$ip/$index/_stats'....

我已经尝试在命令中将变量硬编码为纯文本,就像普通的 curl GET 一样,它工作正常,我可以获得硬编码索引的文档计数。

我试过了:

....GET '$ip/$index/_stats'....

抛出错误:curl: (52) Empty reply from server

.

....GET "${ip}/${index}/_stats"....

抛出错误:curl: (52) Empty reply from server

.

....GET 'http://10.10.15.15/'"$index"'/_stats'....

抛出错误:curl: (52) Empty reply from server

.

....GET '$ip/$index/_stats'....

抛出错误:curl: (52) Empty reply from server

.

url="${ip}/${index}/_stats"
....GET $url ....

抛出错误:curl: (52) Empty reply from server

.

我已经在网上搜索了几个小时,但我发现的任何东西都与 curl PUT 和将变量作为 json 放到服务器上有关。如何使用可变 URL 和索引 curl?

【问题讨论】:

    标签: json bash shell curl


    【解决方案1】:

    编辑:适用于将来发现此内容的任何人。问题的实际原因是使用http 而不是https

    你用的引号都错了。

    '...' 中的变量不会扩展。但是,它们几乎会在其他任何地方展开,例如在双引号内。例如这一行:

    echo "index "$index" has a doc count of "$docs
    

    这里,第二个双引号终止了第一个。这些不能嵌套。你可以这样写:

    echo "index $index has a doc count of $docs"
    

    这意味着您的变量不会在这里扩展:

    ....GET '$ip/$index/_stats'....
    

    这相当于实际发送文字字符串$ip/$index/_stats。您想在此处使用双引号:....GET "$ip/$index/_stats"....

    要注意的另一件事是引用变量赋值的结果。如果出于某种原因此命令的结果:

    curl -k -u $user:$pass -HContent-Type:application/json -X GET '$ip/$index/_stats' | jq '._all.primaries.docs.count'
    

    foo bar,那么变量赋值变成docs=foo bar。这与设置变量docs=foo 并执行程序bar 相同。所以你应该引用整个作业。但是,请使用带引号的作业查看它:

    docs="`curl -k -u $user:$pass -HContent-Type:application/json -X GET "$ip/$index/_stats" | jq '._all.primaries.docs.count'`"
    

    这开始看起来很丑陋和令人困惑。这就是为什么建议在反引号上使用语法$(...) 的原因之一。它们在功能上是等效的,但更容易阅读这里发生的事情:

    docs="$(curl -k -u $user:$pass -HContent-Type:application/json -X GET "$ip/$index/_stats" | jq '._all.primaries.docs.count')"
    

    所以,我有点切题,但这是重要的事情。实际上,您尝试过的这个解决方案应该有效:....GET "${ip}/${index}/_stats"....。我认为您的问题实际上可能与它在脚本中的事实更相关,因为它在脚本之外运行良好。我没有看到 shebang 行,你甚至可能没有运行 bash。您正在使用一些特定于 bash 的功能(如数组)。尝试将#!/bin/bash 添加到脚本顶部。如果这不起作用,请尝试像这样运行您的脚本:bash -x reindex.sh。这就像 bash 的调试模式,它会显示正在执行的解释命令。

    【讨论】:

    • 我忘了把shebang放在帖子里,但它在程序里。我的问题原来是在处理这个问题的过程中的某个地方,我开始使用 http 而不是 https。这会导致curl: (52) Empty reply from server 吸取教训,在假设这是另一个问题之前,请务必检查错误代码。
    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2019-08-27
    相关资源
    最近更新 更多