0
1

More than 1 year has passed since last update.

シェルスクリプトでcurlコマンドを連続実行する

Last updated at Posted at 2023-07-25

実現したいこと

「連番データの入ったCSVファイルの値でHTTPのPOSTリクエストをデータ数分(1000件ほど)実行したい」

ポイントは以下の二つ

  • CSVファイルからfor(loop)文で1件ずつデータを取り出す
  • 取り出した値をリクエストボディに埋め込んでcurlリクエストを投げる

ループ文の書き方とCSVファイルの読み込み方

使用するCSVデータファイル
data.csv
id,name,age
1,yamada_taro,15
2,yamada_hanako,14
3,suzuki_ichiro,20
・・・以下1000行
読み込み処理の記述

while read文でテキストファイルの文字列を一行ずつ取得することができる。
【参考】
https://qiita.com/SoarTec-lab/items/4475ba6de612fba3f163

sample.sh
#!/bin/bash
CSVDATA=data.csv
while read LINE || [ -n "${LINE}" ];
do
id=$(echo $LINE | cut -d, -f 1)
name=$(echo $LINE | cut -d, -f 2)
age=$(echo $LINE | cut -d, -f 3)
echo "id: $id, name: $name, age: $age"
done < $CSVDATA

while read LINE || [ -n "${LINE}" ];
単純にwhile read LINE do とするCSVファイルの最終行が実行されない事がある。
原因はデータファイルの最終行で行で改行していない事。
|| [ -n "${LINE}" ]とすることで最終行が改行文字でない場合も空行でなければ処理する、というような動作をさせることができる

CSVから一行ずつ取り出した後はcut文を使い
id=$(echo $LINE | cut -d, -f 1)
とする事で任意の位置の文字列を変数に格納できる。
(ここでは変数idに1列目左端の文字列を格納している)

curlリクエストの実行

loop処理で1列目のデータを取得できれば後はそのままcurlを実行すれば良い

sample.sh
#!/usr/bin/bash
CSVDATA=data.csv
ReadCount=1
HOST_URL="http://sample.com"
URL=samplePost
while read LINE || [ -n "${LINE}" ];
do
id=$(echo $LINE | cut -d, -f 1)
name=$(echo $LINE | cut -d, -f 2)
age=$(echo $LINE | cut -d, -f 3)
if [ $ReadCount != 1 ]; then
 curl -L-X POST ${HOST_URL}/${URL} -H "id: ${Id}" -d @- << EOS
{
    "name":${name},
    "age":${age}
}
EOS
else
fi
  let ReadCount++
done < $CSVDATA

ReadCountを用意することでCSV一行目のヘッダー行を取り出さないようにしている。
(if文でReadCount = 1の時に処理をスキップ)

-dの部分がリクエストのボディにあたる。
@- << EOSで標準入力を埋め込み、Json型リクエストボディの中で変数を扱えるようにしている。
これでCSVファイルを読み込みながらcurlリクエストが自動で実行されるスクリプトの完成です。

実行する前に!

スクリプトを組んでループ文で1000件POSTリクエストを送るのは慎重に行いましょう(自戒)。無限ループなど起きていたら発狂ものものです。
必ず実行する前に実行環境で処理中断のコマンドを調べてから実行することをおすすめします。
GitBashならCtrl + C!

0
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1