在 bash 中使用输出行作为数组

在 bash 中使用输出行作为数组

我在共享网络主机上有一个 mysql 数据库。它变得太大了,并且带有压缩的单个转储进程被终止。我想单独转储和压缩每个表。用这个命令

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

手动的

   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

也适用于表格中的空格。

相关内容