bash配列からMySQLの結果セットをキャプチャする方法は?

bash配列からMySQLの結果セットをキャプチャする方法は?

CentOS 7でbashシェルを使用しています。シェルスクリプトでMySQLクエリを実行し、各結果行を繰り返したいと思います。 4行が返されると、次のように配列の4行をキャプチャできると思いました。

query="select p.id, p.ebook_id, es.id FROM ...";
echo "$query" > /tmp/query.sql
mysql -u user --password=pass db_id < /tmp/query.sql > /tmp/query.csv

linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`
arraylength=${#linesIN[@]}
echo $arraylength

ただし、複数の結果行が返されることがわかりますが、出力は常に出力されます$arraylength1上記を変更して、配列の各要素が結果セットの行を表す結果配列を正しく生成するにはどうすればよいですか。

答え1

とともに--batchオプションmysql結果は、タブ区切りの列と一緒に1行に1つのレコードとして出力する必要があります。以下を使用して、行を配列として読み取ることができます。バッシュmapfileプロセス置換またはコマンド置換と配列割り当て:

mapfile results  < <( mysql --batch ... < query.sql )

または

set -f        # disable globbing
IFS=$'\n'     # set field separator to NL (only)
results=( $(mysql --batch ... ) )

IFSこの時点以降、変更は変更されず、ワイルドカードは無効になります。)

次に、行の列をいくつかの変数に分割するには、次のようにします。

IFS=$'\t' read -r col1 col2 col2 ... <<< "${results[0]}"

あなたの使命

linesIN=`cat /tmp/query.csv | sed 's/\t/,/g'`

一つでもない配列の割り当て(かっこがありません)単にコマンド置換の出力を通常の文字列変数に割り当てます。 (すべての改行は含まれていますが、まだ単一の文字列です。)${#linesIN[@]}単一要素の配列とスカラー変数はBash / kshで同じように機能するため、まだ機能します。

答え2

別のアプローチは、コマンドの出力をwhileループにパイプすることです。 -Nを含めるか、結果に列名が含まれることに注意してください。

#!/bin/bash
#Script to read output from a mysql command line by line 

mysql -uroot -p example -N -e "select column from table" | while IFS= read -r loop
do
    echo "$loop"
done 

単に計算したい場合は、aを実行してselect count(columnName)結果を印刷できます。

答え3

ファイル内の行数をクエリで返された行数と同じにするには、ファイル内wcの行数の計算を使用します。

  arraylength=$( wc -l < /tmp/query.csv)
  echo $arraylength

関連情報