やりたいこと
次のようなURLのリストファイルがあり、サクッとリクエストして結果(ステータスコード)を確認したい。
url_list.txt
localhost:8080/1
localhost:8080/2
localhost:8080/3
一行ずつファイルを読み込む
考え方としては、
cat
コマンドでファイルの内容を表示- 上記コマンドの実行結果を一行ずつ
while
文で読み取る
シェルスクリプトを書く場合、基本的な構文は以下の通りである。
cat ファイル名 | while read 読み込み変数名
do
# 処理
done
実際に読み込んだファイルのそれぞれの行に「request」という文字を追加してみる。
request.sh
#!/bin/bash
cat url_list.txt | while read url
do
echo "request: ${url}"
done
exit 0
実行結果
$ bash request.sh
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3
処理部分でcurlを実行する
echoしていた部分をcurlコマンドに置き換えれば良い。
※たくさん叩くときはsleep
コマンドで休憩を入れてあげること!
#!/bin/bash
cat url_list.txt | while read url
do
curl -XGET ${url} -s -w "%{http_code}\n" -o /dev/null
sleep 3
done
exit 0
curlコマンドのオプションは以下の通り。
-s
:リクエストの進捗状況を非表示にする-w %{http_code}
:指定したパラメータを取得(この場合はステータスコード)-o /dev/null
:リクエストボディを/dev/null
に捨てる
ワンライナーでサクッと実行する
わざわざスクリプトファイルを作成しても良いが、
慣れてくると面倒になり、ワンライナーで実行するようになる。
ポイントは以下の通り。
- シェルスクリプトで改行していた部分は「
;
」で区切る - 一行で実行したい箇所を複数行で実行したい場合は「
\
」を使うと、見た目上改行できる
$ cat url_list.txt | while read url; do echo "request: ${url}"; sleep 1; done
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3
シェルスクリプトと同じような箇所で改行。
$ cat url_list.txt | while read url;
> do echo "request: ${url}";
> sleep 1;
> done
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3
whileとreadは本来同一行に記述するが、「\
」を挟むことで見た目だけ改行できる。
$ cat url_list.txt | while \
> read url;
> do
> echo "request: ${url}";
> sleep 1;
> done
request: localhost:8080/1
request: localhost:8080/2
request: localhost:8080/3
まとめ
- 「
cat ファイル名 | while read 変数
」で一行ずつ読み込む - ワンライナーで実行する場合「
;
」で改行になる - 連続でcurl実行時はsleepコマンドを必ず挟むこと