54 Stimmen

mysql-Abfrageausgabe in eine Shell-Variable speichern

Ich benötige eine Variable, die die aus der Datenbank abgerufenen Ergebnisse enthält. Bisher ist dies im Grunde, was ich versuche, mit keinem Erfolg.

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

Wie Sie sehen können, kenne ich mich mit Bash-Befehlen nicht besonders gut aus.

93voto

ennuikiller Punkte 44945

Ein direkterer Weg wäre es:

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

58voto

falstro Punkte 32879

Ich weiß nicht viel über die MySQL-Befehlszeilenschnittstelle, aber in der Annahme, dass Sie nur Hilfe beim Bashing brauchen, sollten Sie versuchen, entweder die Befehle wie folgt zu vertauschen:

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

die die Zeichenkette in MySQL wiedergibt. Oder Sie können etwas ausgefallener sein und einige neue Bash-Funktionen verwenden (die Zeichenkette hier)

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

führt zum gleichen Ergebnis (vorausgesetzt, Sie verwenden eine ausreichend aktuelle Bash-Version), ohne dass echo beteiligt ist.

Bitte beachten Sie, dass -p$password kein Tippfehler ist, sondern die Art und Weise, wie MySQL erwartet, dass Passwörter über die Befehlszeile eingegeben werden (ohne Leerzeichen zwischen Option und Wert).

Beachten Sie, dass myvariable alles enth?lt, was MySQL auf standard out ausgibt (normalerweise alles au?er Fehlermeldungen), einschlie?lich aller Spaltenk?pfe, ASCII-Rahmen und so weiter, was Sie vielleicht wollen oder auch nicht.

EDITAR:
Wie bereits festgestellt wurde, scheint es eine -e Parameter zu MySQL, würde ich mich auf jeden Fall für diese Lösung entscheiden.

19voto

Vinko Vrsalovic Punkte 252104

Sie haben die Pipe andersherum und müssen die Abfrage wie folgt wiedergeben:

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

Eine andere Alternative ist, nur den mysql-Client zu verwenden, etwa so

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

( -s ist erforderlich, um die ASCII-Kunst zu vermeiden)

Nun ist BASH nicht die am besten geeignete Sprache, um diese Art von Szenarien zu bewältigen, insbesondere bei der Verarbeitung von Zeichenketten und der Aufteilung von SQL-Ergebnissen und dergleichen. Man muss viel arbeiten, um Dinge zu erreichen, die in Perl, Python oder PHP sehr, sehr einfach wären.

Wie bekommen Sie zum Beispiel jede der Variablen A, B und C auf ihre eigene Variable? Es ist sicherlich machbar, aber wenn Sie nicht verstehen, Pipes und echo (sehr grundlegende Shell-Zeug), es wird nicht eine einfache Aufgabe für Sie zu tun, so dass, wenn überhaupt möglich, würde ich eine besser geeignete Sprache verwenden.

18voto

Dennis Williamson Punkte 322329

Um die Daten zeilenweise in ein Bash-Array einzulesen, können Sie wie folgt vorgehen:

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)

Oder in einzelne Variablen:

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)

10voto

Isidoros Punkte 101

Wenn Sie einen einzelnen Wert in der Bash verwenden wollen, benutzen Sie:

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

  echo "$companyid"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X