はじめに
新人さんがはじめてデータベース絡みのシェルスクリプトを書く、あるいはいろいろ忘れちまったおっさんがうろ覚えでシェルスクリプトを書く際の一助になれば。
シェル芸とかの話では全くないです。
シチュエーション
あなたは、小萌え感ある先輩(あるいは、怖え感ありの先輩)から、
〇〇データベースから、月に何回か売上集計をしたいの。△△なクエリとか🔳🔳なクエリをかけてね。結果は、文字コードutf8でcsvファイルで欲しいの。よろぴく。
と言われましたとさ。
隣の先輩からのアドバイス
- 〇〇データベース : 今回はPostgresで書かれたデータベースなのでpsqlを使う。社内のPCには.pgpassでアクセス用のID/password設定済。
- 月に何回か売上集計をしたい : スクリプトの引数で集計する年月を指定。 すなわち、(${$1}年{$2}$月)
- △△なクエリとか🔳🔳なクエリ : 複数のクエリをかけるので関数化が必要
- 結果は、文字コードutf8で : 文字コードの変換が必要な時は、nkf(Network Kanji Filterの略だとか)を使おう。
- csvファイルで欲しいの : psqlのオプション指定でいけるよ(ググろう)。
- よろぴく。 : 同僚の何人かが実行するだろうから文書化しておこう(略)
お答え
出来上がった、ちょっとやっつけ感あるスクリプト。
ファイルの扱いとかもっと華麗にできたら素敵だね。
answer.sh
#!/bin/bash
# 引数処理
if [ $# -ne 2 ]; then
echo "実行には、2個の引数(年月($1)、実行日($2))の指定が必要です。" 1>&2
exit 1
fi
# CSV出力関数 引数 : 年月($1)、実行日($2)、実行SQL($3)、prefix($4、任意)
makeResult(){
psql -U postgres -h ホストファイル -p ポート番号 -d データベース名 -f "oursqlfolder/$3" -A -F, > ./data/$1/$4_$1_$2.csv
# utf8化したファイルを一時ファイルとして生成
nkf -w ./data/$1/$4_$1_$2.csv > ./data/$1/utf8_$4_$1_$2.csv
# psqlの出力から最終行の『行数表示』を除去して書き戻し
head -n -1 ./data/$1/utf8_$4_$1_$2.csv > ./data/$1/$4_$1_$2.csv
# 生成した一時ファイルを消去
rm ./data/$1/utf8_$4_$1_$2.csv
# デバッグ用 => echo "引数: \$1=$1 , \$2=$2 , \$3=$3, \$4=$4"
}
# 月別にフォルダを作成する
mkdir -p ./data/$1
# 関数呼び出し
makeResult $1 $2 "our_sql_01.sql" "営業1部"
makeResult $1 $2 "our_2019.sql" "営業2部"
# .... ほんとはもっともっとあるんだろうね。....
#生成されたCSVを一覧表示
ls -la ./data/$1
exit 0
実行例:
answer.sh 201904 01
Have a good day!