Bashで出力ラインを配列として使用する

Bashで出力ラインを配列として使用する

共有Webホストに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データベースおよび/またはテーブルを一覧表示し、jw013が提案したように使用することをお勧めします(おそらくオプションwhile read IFS=なし)。-r

答え4

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

テーブルの空白でも機能します。

関連情報