Verwenden von Ausgabezeilen als Array in Bash

Verwenden von Ausgabezeilen als Array in Bash

Ich habe eine MySQL-Datenbank auf einem gemeinsam genutzten Webhost. Sie ist zu groß geworden und ein einzelner Dump-Prozess mit Zip-Komprimierung wird beendet. Ich möchte jede Tabelle einzeln dumpen und zippen. Mit diesem Befehl

mysqldump -uuser -ppass database < show_tables.sql

Ich kann es so einrichten, dass alle Namen der Tabellen zurückgegeben werden:

table1
table2
etc
...

Wie kann ich dies in ein Bash-Skript einspeisen, sodass ich jede Zeile in einen Befehl dieser Syntax einspeisen kann?

mysqldump -uuser -ppass database table_name_goes_here > and_here.sql

?

BearbeitenTut mir leid, Leute, mir ist bei der ursprünglichen Formatierung ein Fehler unterlaufen. Die Ausgabe der show tablesAbfrage ist keine einzelne Zeile mit durch Leerzeichen getrennten Tabellennamen, sondern tatsächlich ein Tabellenname pro Zeile, so wie es jetzt formatiert ist. Ich entschuldige mich für die Verwirrung.

Antwort1

mysqldump -uuser -ppass database < show_tables.sql |
xargs -I TableName sh -c 'mysqldump -uuser -ppass database TableName > TableName.sql'

Antwort2

Vorausgesetzt, die Tabellennamen dürfen keine Zeilenumbrüche enthalten,

mysqldump -uuser -ppass database < show_tables.sql | 
while IFS= read -r table; do
        mysqldump -uuser -ppass database "$table" > and_here.sql
done

Antwort3

DerHandbuchsagt

   Arrays are assigned to using compound assignments of the form name=(value1 ... valuen),

Sie müssen also nur eine Möglichkeit finden, die Ausgabe Ihres Befehls dort einzufügen, wo sie steht value1 ... valuen.

Das können Sie so machen

databases=( $(mysqldump -uuser -ppass database < show_tables.sql) )

und dann wie folgt über sie iterieren

for database in ${databases[*]}; do
    ...
done

aber nur für den Fall, dass Ihr Tabellenname wirklich seltsam ist und einige Zeilenumbrüche enthält, würde ich empfehlen, mysql -Bsezum Auflisten der Datenbanken und/oder Tabellen zu verwenden und es while read IFS=wie von jw013 vorgeschlagen zu verwenden (möglicherweise ohne die -rOption).

Antwort4

mysql database -e 'show tables' | while read table
do mysqldump -uuser -ppass database "$table" -r "$table.sql"
done

Funktioniert auch mit Leerzeichen in den Tabellen.

verwandte Informationen