##環境
使用したbashのバージョンです
$ bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
##ソースの前に・・・
当初、いろいろググってみたところ本件と同じようなことを紹介しているサイトが
多々見つかったのですが
bashの環境変数に IFS というものがあって
これを使用したソースしか見つけられませんでした。
個人的にこういったグローバル的なものは一時的にでもなるべく変更しない
方がよい、と考えているので
これを使わないでどうにか組めないものかと色々やってみた結果になります。
##ソースです
#!/bin/bash
sql="select id, name from MEMBER where age < 20"
result=$(mysql --defaults-extra-file=db.conf -B -N -e "${sql}")
if [[ $? -eq 0 ]]; then
echo "${result}" | while read data
do
column=(`echo "$data"`)
echo "col1=${column[0]}"
echo "col2=${column[1]}"
done
else
echo "db error."
exit 1
fi
exit 0
###出力結果
$ ./hogehoge.sh
col1=1
col2=hoge1
col1=2
col2=hoge2
col1=3
col2=hoge3
col1=4
col2=hoge4
col1=5
col2=hoge5
col1=6
col2=hoge6
col1=8
col2=hoge8
col1=9
col2=hoge9
col1=10
col2=hoge10
##説明です
上から順に説明します
sql="select id, name from MEMBER where age < 20"
実行するSQLの定義です(説明略)
>>result=\$(mysql --defaults-extra-file=db.conf -B -N -e "\${sql}")
mysqlコマンドでsqlを実行します
一応使用しているオプションの説明です
--defaults-extra-file=db.conf
接続情報を書いたコンフィグファイルの指定です。-Bオプションは列をTAB区切りにする指定
-Nオプションは列名を非表示にする指定
-eオプションでSQL指定
>>if [[ \$? -eq 0 ]]; then
SQLが正常に投げれたかどうかを判定
>> echo "\${result}" | while read data >> do >> >> done
SQLの結果分ループする
data変数に1レコード分の結果が入っています。
>> column=(`echo "\$data"`)
data変数を配列に変換
>> echo "col1=\${column[0]}" >> echo "col2=\${column[1]}"
結果を出力。
ここで配列に入っている変数を料理する
こんな感じです
##あとがきとか
selectするカラムが一つしかないときは、スルスルっといけるんですよね・・
複数列の取得になったとたんに面倒に・・・
当初、for ~ in
でやっていたんですが、これだと IFS をいじらないとダメでした・・・
while read に変更してうまくいったんですが
readするときはIFS=を付けておくとstrictな感じで気持ちが良い
という記事もありますし・・・
自分のメモ用/備忘録として投稿しますが
皆様の参考になれば幸いです