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 行ではありません。現在のフォーマットでは、実際には 1 行に 1 つのテーブル名です。混乱を招いてしまい申し訳ありません。

答え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

テーブル内のスペースでも機能します。

関連情報