在 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

也適用於表格中的空格。

相關內容