Добавить содержимое текстового файла в массив в Bash - PullRequest
1 голос
/ 17 марта 2020

Я пытаюсь выполнить curl для 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"

Ответы [ 3 ]

1 голос
/ 17 марта 2020

У вас есть файл с отформатированными словами оболочки, которые вы пытаетесь повторять в команде снова и снова.

Поскольку слова отформатированы в оболочке, вам нужно будет интерпретировать их, например, eval:

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

Более надежный дизайн будет состоять в том, чтобы не использовать кавычки оболочки и вместо этого форматировать один аргумент в строке:

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

Затем можно использовать приведенный выше код и заменить eval строка с:

mapfile -t words < file.txt
0 голосов
/ 19 марта 2020

Ответ на этот вопрос должен был состоять в том, чтобы «поместить каждый запрос в файл, по одному параметру в строке, и использовать -K/--config для включения файла в командную строку». Это, безусловно, должно разрешить 300 запросов в одной команде curl без превышения ограничения на размер команды оболочки. (Под «запросом» здесь я подразумеваю «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, и большое спасибо Даниэлю Стенбергу за невероятно отзывчивый подход к исправлению. менее чем за два дня. Так что, вероятно, проблема будет решена в следующем выпуске curl.

0 голосов
/ 17 марта 2020
array=();
for i in {1..300}; do
  array+=( $(cat file.txt|head -$i | tail -1) );
done; 
curl "${array[@]}";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...