はじめに
BashはAWS EC2など多くのUNIX環境で用いられているシェルの一種で、OSコマンドや制御文で簡易的にプログラミングができる。
普段はPythonやGoで開発をする筆者がテスト用のデータのためにシェルスクリプトから大量のSQL文を生成するプログラムを生成した経験から、シェルスクリプトの入門向けの内容をコードベースで記す。
先頭行について
シェルスクリプトの先頭には以下のコメントのように実行する実行系を指定できる。
この #!
から始まる1行目をShebangという。
#!/bin/bash
変数
変数名=値
で変数が使える。
# 変数名=文字列、数値 で代入する
VAR="変数"
NUM=12
# 配列も定義可能
ARRAY=(1 2 3)
# shellコマンドの結果も格納できる
RESULT=`ls`
loop
for 条件;
do
処理
done
とすることでloop処理が可能
# 1から10を $i に代入して繰り返す場合
for (( i=1; i<=10; i++ ));
do
echo $i
done
# 配列の要素を $i に入れて繰り返す場合
ARRAY=(1 3 5)
for i in "${ARRAY[@]}" ;
do
echo $i
done
条件分岐
if 条件1; then
条件1がtrueのときの処理
elif 条件2; then
条件2がtrueのときの処理
fi
で条件分岐処理が可能。
# 文字列での比較
STR="hogehoge"
if [ $STR = "hogehoge" ]; then
echo "STR is hogehoge"
elif [ $STR = "HOGEHOGE" ]; then
echo "STR is HOGEHOGE"
fi
# 数値での比較
NUM=12
if [ $(( NUM % 2 )) -eq 0 ]; then
echo "NUM is even"
else
echo "NUM is odd"
fi
SQLの生成の例
以上の基本から大量のSQLを生成してみる例を作ってみる。
例えば以下のようなテーブルを定義して、FizzBuzz問題の解答を1~50でSQLでインサートする例を考えてみる。
なおデータベースはMySQLとします。
CREATE TABLE `fizzbuzz` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`value` varchar(255)
);
以下のようなbashとなります。
#!/bin/bash
for (( i=1; i<=50; i++));
do
VALUE=$i
if [ $(( i % 3 )) -eq 0 -a $(( i % 5 )) -eq 0 ]; then
VALUE="\"Fizz Buzz\""
elif [ $(( i % 3 )) -eq 0 ]; then
VALUE="\"Fizz\""
elif [ $(( i % 5 )) -eq 0 ]; then
VALUE="\"Buzz\""
fi
echo "INSERT INTO fizzbuzz VALUES ($i, $VALUE);"
done
これを保存し以下のコマンドで50行のSQLが1コマンドで作成できる。
$ bash fizzbuzz.bash > fizzbuzz.sql