【问题标题】:Add content of a text file to array in Bash将文本文件的内容添加到 Bash 中的数组
【发布时间】:2020-06-28 21:36:06
【问题描述】:

我正在尝试同时执行 300 个 curl 并使用数组。我不知道如何将我的文件内容放入数组中。我写的代码如下。

array=();
for i in {1..300}; do
  array+=( file.txt ) ; 
done; 
curl "${array[@]}";

file.text 包含以下代码

  --next 'https://d16.server.com/easy/api/OmsOrder' -H 'Connection: keep- 
  alive' - H 'Pragma: no-cache' -H 'Cache-Control: no-cache' -H 'Accept: 
  application/json, 
  text/plain, */*' -H 'Sec-Fetch-Dest: empty' -H 'User-Agent: Mozilla/5.0 
 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) 
  Chrome/80.0.3987.132 Safari/537.36' -H 'Content-Type: application/json' -H 
 'Origin: https://d.server.com' -H 'Sec-Fetch-Site: same-site' -H 
 'Sec-Fetch-Mode: cors' -H 'Referer: https://d.server.com/' -H 'Accept- 
  Language: en-US,en;q=0.9,fa;q=0.8' --data-binary 
 '{"isin":"IRO3TPEZ0001","financeId":1,"quantity":50000,"price":5400}' -- 
  compressed"

【问题讨论】:

  • “file.txt”中有什么内容?网址?是否要将文件中的前 300 行传递给 curl 并忽略其余部分?
  • @thatotherguy file.txt 包含一个 JSON 工作人员,它太长了。我想将它发布到服务器 300 次。当我将文件的内容带到这里时,我会收到此错误“-bash: /usr/bin/curl: Argument list too long”
  • 您的示例中没有服务器,因此无法正常工作。在尝试将任何内容放入循环或数组中之前,您应该弄清楚一次发布到服务器的完整命令。
  • 你的脚本会这样做:curl file.txt file.txt file.txt ...,300 次 file.txt
  • @thatotherguy 我已将员工放入 file.txt。文件文本包括服务器和标题和数据。

标签: arrays linux bash curl terminal


【解决方案1】:
array=();
for i in {1..300}; do
  array+=( $(cat file.txt|head -$i | tail -1) );
done; 
curl "${array[@]}";

【讨论】:

【解决方案2】:

您有一个文件,其中包含您试图在命令中一遍又一遍地重复的 shell 格式的单词。

由于单词是 shell 格式的,你需要使用例如解释它们。 eval:

contents=$(< file.txt)
eval "words=( $contents )"
arguments=()
for i in {1..300}
do
  arguments+=( "${words[@]}" )
done
curl "${arguments[@]}"

更健壮的设计是不使用 shell 引用,而是每行格式化一个参数:

--next
https://d16.server.com/easy/api/OmsOrder
-H
Connection: keep-alive
-H
Pragma: no-cache

然后您可以使用上面的代码并将eval 行替换为:

mapfile -t words < file.txt

【讨论】:

  • 这项工作适用于 100 但适用于 300 我将再次收到错误“-bash: /usr/bin/curl: Argument list too long”
  • @Andrea uname -srulimit -s 的输出是什么?你的file.txt 总共有多大?
  • file.txt 为 2kb。
  • uname -srulimit -s 的输出是什么?
  • 我不明白你说的 uname -sr 和 ulimit -s 是什么意思
【解决方案3】:

这个问题的答案应该是“将每个请求放入一个文件,每行一个选项,并使用-K/--config 将文件包含到命令行中。”这当然应该允许在单个 curl 命令中处理 300 个请求,而不会超过 shell 命令大小的限制。 (这里的“请求”是指“带有相关选项的 URL”。如果您只想使用 300 个 URL 而不修改任何其他选项,则只需在命令行上列出 URL(如果它们不是)就可以轻松做到这一点) t 太长或在文件中。)

不幸的是,它不起作用。我相信它应该可以工作,而事实并非如此是一个错误。如果您指定多个-K 选项,并且每个选项都引用一个包含一个请求和--next 选项的文件,那么curl 将只执行第一个和最后一个文件。如果您将命令行中的--next 选项放在-K 选项之间,则所有请求选项都将被合并,此外curl 会抱怨缺少URL。

但是,您可以使用-K 选项,将所有 300 个请求连接起来并通过stdin 传递它们,使用-K -stdin 中读取。为了测试这一点,我创建了包含单个请求的文件:

$ cat post-req
--next
-H "Connection: keep-alive"
-H "Pragma: no-cache" 
-H "Cache-Control: no-cache" 
-H "Accept: application/json, text/plain, */*" 
-H "Sec-Fetch-Dest: empty" 
-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36" 
-H "Content-Type: application/json" 
-H "Origin: https://d.server.com" 
-H "Sec-Fetch-Site: same-site" 
-H "Sec-Fetch-Mode: cors" 
-H "Referer: https://d.server.com/" 
-H "Accept-Language: en-US,en;q=0.9,fa;q=0.8" 
--data-binary "{\"isin\":\"IRO3TPEZ0001\",\"financeId\":1,\"quantity\":50000,\"price\":5400}" 
--compressed
--url "http://localhost/foo"

然后设置一个只返回请求路径的小型网络服务器,并使用以下命令调用 curl:

for i in $(seq 300); do cat post-req; done | curl -K -

确实,三百个请求都通过了。

对于它的价值,我将该错误报告为 https://github.com/curl/curl/issues/5120,非常感谢 Daniel Stenberg 在不到两天的时间内提交修复程序,做出了令人难以置信的响应。所以这个问题可能会在下一个 curl 版本中得到解决。

【讨论】:

  • 感谢您的回答,但是当我在终端上运行for i in $(seq 300); do cat post-req; done | curl -K - 时会收到类似Warning: &lt;stdin&gt;:1: warning: '$' is unknown Warning: &lt;stdin&gt;:3: warning: ''https' is unknown 的错误,如果您能告诉我原因,我将不胜感激?还有一件事,我怎样才能加快这些请求并提出更多请求?
  • @andrea:$cat post-req 行是我在输入一个 bash 命令来显示文件。您不应该将其放入文件中。关于https的错误是因为您没有遵循我文件中的模型;在配置文件中,--url 选项是强制性的。您不能像在命令行上那样忽略它。有关详细信息,请参阅 Curl 的帮助。
  • 我做得对,而且效果很好。只是想知道如何加快速度并在 1 秒内发布 1000 个?有什么办法可以做到这一点确实我的电脑在 9 秒内发送了 300 个请求。
  • 对于您的其他问题,如果您的 curl 版本足够新,您可以查看 --parallel 选项。 (我相信你需要 7.66.0。)如果不是你的,请尽量避免违反网络服务器的使用条款。
  • 只需在终端中测试 Bash,但它只发送 175 并得到他们的响应。假设发布 300 个请求并获得 300 个响应,这是怎么回事?
猜你喜欢
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多