我正在使用bash脚本执行一些mysqldump备份。我不擅长编写脚本。
我有:
#!/bin/bash
TNAMES="database1.tableA database2.tableD databaseN.tableZ"
我需要解析TNAMES以将数据库部分与表部分分开以执行mysqldump
for TABLE in $TNAMES
do
mysqldump $OPTIONS $USER $PASSWORD $DB $TABLENAME > "some_file.sql"
(some more actions here)
done
所以在第一次循环迭代中,命令将是:
mysqldump $OPTIONS $USER $PASSWORD database1 tableA > "some_file.sql"
下一步:
mysqldump $OPTIONS $USER $PASSWORD database2 tableD > "some_file.sql"
下一步:
mysqldump $OPTIONS $USER $PASSWORD databaseN tableZ > "some_file.sql"
等等。
使用awk有什么简单的方法吗?
答案 0 :(得分:2)
你不需要sed,awk或cut来执行简单的前缀/后缀删除:
for spec in $TNAMES; do
db=${spec%%.*}
tb=${spec#*.}
mysqldump ... $db $tb > $somewhere
done
答案 1 :(得分:1)
你可以使用“cut”:
for TABLE in $TNAMES
do
DB=$(echo "$TABLE" | cut -d '.' -f 1)
TABLENAME=$(echo "$TABLE" | cut -d '.' -f 2)
mysqldump "$OPTIONS" "$USER" "$PASSWORD" "$DB" "$TABLENAME" > "some_file.sql"
done
答案 2 :(得分:1)
由于您在bash中启动变量,因此可以使用数组:
Database[0]="database1"
Database[1]="database2"
...
Table[0]="tableA"
Table[1]="tableB"
...
# Loop over the table index
for i in $(seq 0 $((${#Database[@]}-1)))
do
mysqldump $OPTIONS $USER $PASSWORD ${Database[$i]} ${Table[$i]} >> "some_file.sql"
done
我冒昧地发生在文件>>
上,而不是每次都创建一个新文件。
答案 3 :(得分:0)
你也可以使用像
这样的东西#!/bin/bash
TNAMES="database1.tableA database2.tableD databaseN.tableZ"
for TABLE in "$TNAMES"
do
while IFS='.' read DB TABLENAME
do
mysqldump "$OPTIONS" "$USER" "$PASSWORD" "$DB" "$TABLENAME" > "some_file.sql"
done <<<"$TABLE";
done