Arrays 在Bash中将文本文件的内容添加到数组中

Arrays 在Bash中将文本文件的内容添加到数组中,arrays,linux,bash,curl,terminal,Arrays,Linux,Bash,Curl,Terminal,我试图同时执行一个300的旋度,并使用数组。我不知道如何将我的文件内容放入数组中。我写的代码如下 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-

我试图同时执行一个300的旋度,并使用数组。我不知道如何将我的文件内容放入数组中。我写的代码如下

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"
array=();
对于{1..300}中的i;做
数组+=($(cat file.txt | head-$i | tail-1));
完成;
curl“${array[@]}”;

您有一个包含shell格式单词的文件,您正试图在命令中反复重复这些单词

由于单词是shell格式的,因此您需要使用例如
eval

contents=$(< file.txt)
eval "words=( $contents )"
arguments=()
for i in {1..300}
do
  arguments+=( "${words[@]}" )
done
curl "${arguments[@]}"
然后,您可以使用上述代码并将
eval
行替换为:

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

不幸的是,它不起作用。我相信它是应该工作的,但事实上它不工作是一个错误。如果指定多个
-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"
然后设置一个只返回请求路径的小型Web服务器,并使用以下命令调用curl:

for i in $(seq 300); do cat post-req; done | curl -K -
事实上,三百个请求都通过了


值得一提的是,我将这个bug报告为,非常感谢Daniel Stenberg在不到两天的时间内提交了一个修复程序,做出了令人难以置信的响应。因此,这个问题可能会在下一个curl版本中得到解决。

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
@that otherguy我已将工作人员放入file.txt。文件文本包括服务器和头文件以及数据。使用sed-n“${i}p”可以稍微改进一下吗?当然有一种方法不是O(n^2)?也许吧?这项工作持续了100年,但如果持续了300年,我将再次收到错误“-bash:/usr/bin/curl:参数列表太长”@Andrea
uname-sr
ulimit-s
的输出是什么?你的
file.txt总共有多大?file.txt是2kb。uname-sr
ulimit-s
的输出是什么?我不明白你所说的uname-sr和ulimit-sThanks是什么意思,但当我用$为I运行
(seq 300);执行cat post请求;完成| curl-K-
到终端将得到类似以下错误的警告::1:警告:“$”未知警告::3:警告:“'https'未知如果您能告诉我原因,我将不胜感激?还有一件事,我怎样才能加快这些请求的速度并发出更多的请求?@andrea:line
$cat post req
是我键入一个bash命令,显示文件。你不应该把它放进档案里。关于https的错误是因为您没有遵循我文件中的模型;在配置文件中,
--url
选项是必需的。您不能像在命令行中一样将其忽略。有关更多详细信息,请参阅Curl的帮助。我已经正确地完成了它,并且工作得非常好。只是想知道如何加快速度,并在1秒内发布1000条?我的电脑在9秒内发送了300个请求。至于你的另一个问题,如果你的curl版本足够新,你可以看看
--parallel
选项。(你需要7.66.0,我相信。)如果不是你的,请尽量避免违反Web服务器的使用条款。只需在终端中测试Bash,但它只发送175,并得到他们的响应。它假设发出300个请求,得到300个响应,怎么了?
for i in $(seq 300); do cat post-req; done | curl -K -