如何通过替换字段来生成多行命令/脚本

时间:2013-01-20 04:36:36

标签: bash

假设我有一个命令:

mysql -h localhost -u root -pmypassword dev<file01.sql;

我有很多要运行的sql文件:file02.sql,file03.sql,... file99.sql

我想生成一个像这样的bash脚本来顺序运行所有这些sql文件。

bash脚本的一部分如下所示:

mysql -h localhost -u root -pmypassword dev<file01.sql;
mysql -h localhost -u root -pmypassword dev<file02.sql;
mysql -h localhost -u root -pmypassword dev<file03.sql;


mysql -h localhost -u root -pmypassword dev<file99.sql;

所有这些行具有相同的模式,只有文件名(filexx.sql)发生变化。

所有filexx.sql都在同一目录中。

我通常在Excel中生成bash脚本。我知道这可以在bash中轻松完成,我只是不知道如何。你能告诉我如何生成这个吗?

非常感谢。

3 个答案:

答案 0 :(得分:1)

如果你想执行这些陈述:

for fileid in $(seq 1 99); do
    filename=$(printf "file%02d.sql" $fileid)
    mysql -h localhost -u root -pmypassword dev < $filename
done

但如果您只想生成它们:

for fileid in $(seq 1 99); do
    filename=$(printf "file%02d.sql" $fileid)
    echo "mysql -h localhost -u root -pmypassword dev < $filename"
done

答案 1 :(得分:0)

在bash中,这可能会更快,但只有便携式,因为bash是可移植的:

for i in {1..99};do
    sqlfile=$(printf "file%02d.sql" $i)
    mysql -h localhost -u root -pmypassword dev < $sqlfile
  done

这似乎与for i in $(seq 1 99) ;do非常接近,但在这种情况下,数字列表生成由bash完成。

使用seq暗示 fork (从bash运行另一个二进制文件以使用他的输出)。

完全可以以简化的方式使用seq

for sqlfile in $(seq -f file%02g.sql 1 99);do
    mysql -h localhost -u root -pmypassword dev < $sqlfile
  done

答案 2 :(得分:0)

Bash的brace expansion救援:

for file in file{00..99}.sql; do
    mysql -h localhost -u root -pmypassword dev < $file
done