использование строк вывода в виде массива в bash

использование строк вывода в виде массива в bash

У меня есть база данных mysql на общем веб-хостинге. Она стала слишком большой, и один процесс дампа с zip-архивированием останавливается. Я хочу дампить и zip-архивировать каждую таблицу по отдельности. С помощью этой команды

mysqldump -uuser -ppass database < show_tables.sql

Я могу заставить его вернуть все имена таблиц следующим образом:

table1
table2
etc
...

Как мне передать это в скрипт bash, чтобы можно было передать каждую строку в команду с таким синтаксисом?

mysqldump -uuser -ppass database table_name_goes_here > and_here.sql

?

РедактироватьИзвините, ребята, я допустил ошибку в исходном форматировании. Вывод запроса show tables— это не одна строка с именами таблиц, разделенными пробелами; на самом деле это одно имя таблицы на строку, как это отформатировано сейчас. Приношу извинения за путаницу.

решение1

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

решение2

Предполагая, что имена таблиц не могут содержать символы новой строки,

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

решение3

Theруководствоговорит

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

поэтому вам просто нужен способ поместить вывод вашей команды туда, где она указана value1 ... valuen.

Вы можете сделать это вот так

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

и затем перебрать их вот так

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

но на всякий случай, если имя вашей таблицы действительно странное и содержит несколько новых строк, я бы рекомендовал использовать mysql -Bseдля перечисления баз данных и/или таблиц, и использовать while read IFS=так, как предлагает jw013 (возможно, без этой -rопции).

решение4

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

Работает также с пробелами в таблицах.

Связанный контент