4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-12

##環境

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

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

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?