2017-07-03 91 views
0

我是bash脚本中的新品牌。我想用forloop编写一个脚本,它会给我下面的行并执行这些行。用于使用forloop创建多个文件的bash脚本

gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 1000 -e 10000 -skip 10 -o 1.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 2000 -e 20000 -skip 10 -o 2.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 3000 -e 30000 -skip 10 -o 3.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 4000 -e 40000 -skip 10 -o 4.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 5000 -e 50000 -skip 10 -o 5.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 6000 -e 60000 -skip 10 -o 6.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 7000 -e 70000 -skip 10 -o 7.out 

....

+0

你的问题不太清楚。你想要一个不同的脚本来执行每个命令并从另一个脚本中调用它吗?请澄清。 – Difster

+0

我想要创建该命令并执行该命令的脚本 – parash

回答

4

还可以保存几个打字行的,并让他们全部并行完成与GNU并行

parallel gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b {}000 -e {}0000 -skip 10 -o {}.out ::: {1..7} 

如果你想看看它会做什么,但没有做任何事情,请使用parallel --dry-run

+0

我将不得不与这些日子中的一个并行交朋友...... –

+0

@ DavidC.Rankin你知道这很有道理 - 特别是随着CPU继续变宽(更多核心)而不是更高(更多GHz).... :-) –

+0

非常好的命令!'parallel'不随Ubuntu发货 –

1

使用for循环基本的bash:

for i in {1..7}; do 
    gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b ${i}000 -e ${i}0000 -skip 10 -o $i.out 
done 
+0

您需要将'-b'和'-e'值乘以'$ i'。 (例如'-b $((i * 1000))') –

+0

我没有看到,谢谢@ DavidC.Rankin。你不必乘以,'$ {i} 000'就可以做到这一点:) –

+2

当然,这是解决问题的另一种创造性方式。我会给你一个投票'')' –

1

可以使用C风格的循环为好,例如

for ((i = 1; i < 8; i++)); do 
    echo "gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b $((i * 1000)) -e $((i * 10000)) -skip 10 -o $i.out" 
done 

示例使用/输出

$ for ((i = 1; i < 8; i++)); do 
>  echo "gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b $((i * 1000)) -e $((i * 10000)) -skip 10 -o $i.out" 
> done 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 1000 -e 10000 -skip 10 -o 1.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 2000 -e 20000 -skip 10 -o 2.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 3000 -e 30000 -skip 10 -o 3.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 4000 -e 40000 -skip 10 -o 4.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 5000 -e 50000 -skip 10 -o 5.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 6000 -e 60000 -skip 10 -o 6.out 
gmx trjconv -f md_0_1.xtc -s md_0_1.tpr -b 7000 -e 70000 -skip 10 -o 7.out 
+0

亲爱的主席先生,它给了我语法错误:不好的循环变量 – parash

+0

嗯,你是否在别处使用'i'作为变量?这是我能想到的唯一的事情。显然'我'不是一个*循环变量坏* ...确保你没有错字。 (你可以直接将代码复制/粘贴到xterm来运行它 - 它的工作原理 - 没有错误...(确保你不用'>'复制最上面的代码(这些只是终端线延续标记(实际上你的PS3提示)当输入多线路输入时,终端输出) –