Ich verwende die Bash-Shell unter CentOS 7. Ich möchte eine MySQL-Abfrage über ein Shell-Skript ausführen und jede Ergebniszeile durchlaufen. Wenn 4 Zeilen zurückgegeben würden, dachte ich, ich könnte die vier Zeilen in einem Array wie folgt erfassen:
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
$arraylength
Wird jedoch immer ausgegeben 1
, obwohl mehrere Ergebniszeilen zurückgegeben werden. Wie kann ich das oben Gesagte ändern, um ein Array von Ergebnissen korrekt zu erstellen, wobei jedes Element im Array eine Zeile aus der Ergebnismenge darstellt?
--batch
für Ihrenmysql
Aufruf verwenden? Dafür ist es da.Antworten:
Mit der
--batch
Option ,mysql
sollte auf einer Linie das Ergebnis ein Datensatz ausgegeben und Spalten durch Tabulatoren getrennt. Sie können die Zeilen zu einem Array mit Bashsmapfile
und Prozessersetzung oder Befehlsersetzung und Arrayzuweisung lesen :oder
(Beachten Sie, dass danach
IFS
Änderungen und Globbing deaktiviert bleiben.)Wenn Sie dann die Spalten einer Zeile in einige Variablen aufteilen möchten:
Ihre Aufgabe
ist keine Array-Zuweisung (es fehlt die Klammer). Es wird lediglich die Ausgabe der Befehlssubstitution einer regulären Zeichenfolgenvariablen zugewiesen. (Alle Zeilenumbrüche werden dort eingebettet, es handelt sich jedoch weiterhin um eine einzelne Zeichenfolge.) Funktioniert
${#linesIN[@]}
weiterhin, da in Bash / ksh Einzelelement-Arrays und Skalarvariablen gleich funktionieren.quelle
Eine andere Möglichkeit wäre, die Ausgabe des Befehls an eine while-Schleife weiterzuleiten. Beachten Sie, dass Sie das -N oder die Ergebnisse den Spaltennamen enthalten möchten.
Und wenn Sie nur zählen möchten, führen Sie eine aus
select count(columnName)
und drucken die Ergebnisse aus.quelle
while
.Wenn Sie möchten, dass die Anzahl der Zeilen in einer Datei der Anzahl der von der Abfrage zurückgegebenen Zeilen entspricht, zählen Sie einfach die
wc
Anzahl der Zeilen in der Dateiquelle
wc -l </tmp/query.csv
vermieden, dass der Dateiname entfernt werden muss