假设我有一个命令:
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中轻松完成,我只是不知道如何。你能告诉我如何生成这个吗?
非常感谢。
答案 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