web-dev-qa-db-ja.com

mysqlクエリの出力をシェル変数に保存する

データベースから取得した結果を保持する変数が必要です。これまでのところ、これは基本的に私が試みているもので、成功していません。

myvariable=$(mysql database -u $user -p $password | SELECT A, B, C FROM table_a)

ご覧のとおり、bashコマンドの私の理解はあまり良くありません。

34
imnotneo

MySQLコマンドラインインターフェースについてはあまり知りませんが、バッシングのヘルプだけが必要であると仮定して、次のようにコマンドを入れ替えてみてください。

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p$password)

文字列をMySQLにエコーします。または、もっと派手になり、新しいbash機能(ここの文字列)を使用することもできます

myvariable=$(mysql database -u $user -p$password<<<"SELECT A, B, C FROM table_a")

エコーを伴わずに、同じこと(最新の十分なbashバージョンを使用していると仮定)になります。

-p $ passwordはタイプミスではありませんが、MySQLはコマンドラインからパスワードを入力することを想定していることに注意してください(オプションと値の間にスペースはありません)。

Myvariableには、すべての列ヘッダー、ASCIIアートフレームなど、MySQLが標準出力で出力するすべて(通常はエラーメッセージを除くすべて)が含まれていることに注意してください。

編集:
既に述べたように、-eパラメータをMySQLに追加します。間違いなくそのために行きます。

43
falstro

より直接的な方法は次のとおりです。

myvar=$(mysql mydatabase -u $user -p$password -se "SELECT a, b, c FROM table_a")
57
ennuikiller

データを1行ずつBash配列に読み込むには、次のようにします。

while read -a row
do
    echo "..${row[0]}..${row[1]}..${row[2]}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)

または個々の変数に:

while read a b c
do
    echo "..${a}..${b}..${c}.."
done < <(echo "SELECT A, B, C FROM table_a" | mysql database -u $user -p $password)
15

あなたはパイプを反対方向に持っているので、次のようにクエリをエコーする必要があります:

myvariable=$(echo "SELECT A, B, C FROM table_a" | mysql db -u $user -p $password)

別の選択肢は、このようにmysqlクライアントのみを使用することです

myvariable=$(mysql db -u $user -p $password -se "SELECT A, B, C FROM table_a")

-sはASCIIアートを回避するために必要です)

現在、BASHはこのタイプのシナリオ、特に文字列の処理やSQL結果の分割などを処理するのに最適な言語ではありません。 Perlで非常に簡単なものを得るには、多くの作業を行う必要があります。PythonまたはPHP。

たとえば、A、B、Cをそれぞれ独自の変数で取得するにはどうしますか?確かに実行可能ですが、パイプとエコー(非常に基本的なシェルのこと)を理解していない場合、それは簡単な作業ではありません。可能な限り、より適した言語を使用します。

12
Vinko Vrsalovic

Bashで単一の値を使用する場合:

  companyid=$(mysql --user=$Username --password=$Password --database=$Database -s --execute="select CompanyID from mytable limit 1;"|cut -f1)

  echo "$companyid"
8
Isidoros
myvariable=$(mysql database -u $user -p$password | SELECT A, B, C FROM table_a)

-pの後の空白なし。些細ですが、機能しません。

3
puchrojo

特定のデータベース名と、クエリを実行するホストがある場合は、以下のクエリに従います。

outputofquery=$(mysql -u"$dbusername" -p"$dbpassword" -h"$dbhostname" -e "SELECT A, B, C FROM table_a;" $dbname)

したがって、mysqlクエリを実行するには、Linuxにmysqlクライアントをインストールする必要があります

2
Tamgale Prasad

テーブル名またはデータベースにスペースや「-」などのサポートされていない文字が含まれている場合の別の例

db='data-base'

db_d=''
db_d+='`'
db_d+=$db
db_d+='`'

myvariable=`mysql --user=$user --password=$password -e "SELECT A, B, C FROM $db_d.table_a;"`
0
Sanya Snex
myvariable=$(mysql -u user -p'password' -s -N <<QUERY_INPUT
    use databaseName;
    SELECT fieldName FROM tablename WHERE filedName='fieldValue';
QUERY_INPUT
)
echo "myvariable=$myvariable"
0
Dima