Bash
MySQL

IFSを変更せずにmysqlのselectの結果(複数カラム)をbashの変数に入れる

環境

使用した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な感じで気持ちが良い
という記事もありますし・・・

自分のメモ用/備忘録として投稿しますが
皆様の参考になれば幸いです