usando líneas de salida como una matriz en bash

usando líneas de salida como una matriz en bash

Tengo una base de datos MySQL en un servidor web compartido. Ha crecido demasiado y se está eliminando un único proceso de volcado con compresión. Quiero volcar y comprimir cada tabla individualmente. con este comando

mysqldump -uuser -ppass database < show_tables.sql

Puedo hacer que devuelva todos los nombres de las tablas de esta manera:

table1
table2
etc
...

¿Cómo puedo introducir esto en un script bash para poder introducir cada línea en un comando de esta sintaxis?

mysqldump -uuser -ppass database table_name_goes_here > and_here.sql

?

EditarLo siento amigos, cometí un error en el formato original. El resultado de la show tablesconsulta no es una sola línea con nombres de tablas delimitados por espacios; en realidad es un nombre de tabla por línea, tal como está formateado ahora. Me disculpo por la confusión.

Respuesta1

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

Respuesta2

Suponiendo que los nombres de las tablas no pueden contener nuevas líneas,

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

Respuesta3

Elmanualdice

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

entonces solo necesitas una manera de poner la salida de tu comando donde dice value1 ... valuen.

Puedes hacerlo así

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

y luego iterar sobre ellos así

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

pero en caso de que el nombre de su tabla sea realmente extraño y contenga algunas líneas nuevas, recomendaría usarlo mysql -Bsepara enumerar las bases de datos y/o tablas, y usarlo while read IFS=como sugiere jw013 (posiblemente sin la -ropción).

Respuesta4

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

También funciona con espacios en las tablas.

información relacionada