【注意】初めてまともに作成したshellスクリプトです。
SSH経由でmysqlにアクセスしてクエリ実行結果をTSVに出力します(たぶん)
下記について 調べながら 実装しています
変数・コマンドライン引数
if文
外部ファイルの読み込み
コマンドの実行
配列&配列を動的に参照
参考にさせていただいたサイト
- Using Configuration Files With Shell Scripts
- ステップ・バイ・ステップ・シェルスクリプト(5):シェルの変数に慣れる
- Bashで覚えておくとよいデータ構造 - 配列
- evalで変数名を変数にする@bash
fetch_query.sh
#!/bin/sh
PATH_TO_OUTPUT_DIR="/xxxx/yyyy/zzzzz/"
## (SSH経由でmysqlにアクセスしてクエリ実行結果をTSVに出力するサンプル)
if [ $# -ne 3 ]; then
echo "[ERROR]Set parameter [param1], [param2], [output tsv file prefix]"
exit 1
fi
param1=$1
param2=$2
tsv_prefix=$3
tsv_ymd=`date "+%Y%m%d"`
## Load setting files
## (各種設定ファイルを読み込む)
CONFIG="dblist.conf"
FETCH_QUERY="fetch_query.sql"
if [[ ! -f ${CONFIG} ]]; then
echo "[ERROR] Not found file ${CONFIG}"
exit 1
fi
if [[ ! -f ${FETCH_QUERY} ]]; then
echo "[ERROR] Not found file ${FETCH_QUERY}"
exit 1
fi
. ./${CONFIG}
. ./${FETCH_QUERY}
echo "[INFO] === START === (`date`)"
result_data_tsv="${tsv_prefix}_${param1}_${param2}_${tsv_ymd}.tsv"
query=${FETCH_TARGET_SQL}
## Import from remote.
## (配列の参照)
param2_db_con_str=$(eval echo '${LIST_'${param1}'_CON_LIST['${param2}']}')
echo "[INFO] Import data to ${result_data_tsv} from connection (${param2_db_con_str})"
echo "${query}" | ssh ${SSH_STR} mysql -N -B ${param2_db_con_str} > ${PATH_TO_OUTPUT_DIR}${result_data_tsv}
echo "[INFO] === END === (`date`)"
exit 0
dblist.conf
## (ssh接続※config管理してる場合※)
SSH_STR="ssh-tool"
## (接続文字列リスト)
LIST_1_CON_LIST=()
LIST_1_CON_LIST[0]="'-uuser' '-ppass' '-hlocalhost' '-P3306' 'sample_db'"
LIST_1_CON_LIST[1]=""
LIST_1_CON_LIST[2]=""
LIST_1_CON_LIST[3]=""
LIST_2_CON_LIST=()
LIST_2_CON_LIST[0]=""
LIST_2_CON_LIST[1]=""
LIST_2_CON_LIST[2]=""
LIST_2_CON_LIST[3]=""
fetch_query.sql
# 文字列を動的に埋め込むなら
FETCH_TARGET_SQL="select ${param1}, ${param2}, user_id from hogehoge"
上記『文字列を動的に埋め込むなら』がなぜか赤枠で囲まれているのは原因不明です