#!/bin/sh
init=step5_input
rest_prefix=step5_input
mini_prefix=step6.0_minimization
equi_prefix=step6.%d_equilibration
prod_prefix=step7_production
prod_step=step7
# Minimization
gmx grompp -f ${mini_prefix}.mdp -o ${mini_prefix}.tpr -c ${init}.gro -r ${rest_prefix}.gro -p topol.top -n index.ndx
gmx mdrun -v -deffnm ${mini_prefix}
# Equilibration
cnt=1
cntmax=6
while [ ${cnt} <= ${cntmax} ]
@ pcnt = ${cnt} - 1
istep=`printf ${equi_prefix} ${cnt}`
pstep= `printf ${equi_prefix} ${pcnt}`
if [ ${cnt} == 1 ] then pstep=${mini_prefix}
gmx grompp -f ${istep}.mdp -o ${istep}.tpr -c ${pstep}.gro -r ${rest_prefix}.gro -p topol.top -n index.ndx
gmx mdrun -v -deffnm ${istep}
@ cnt += 1
end
# Production
cnt=1
cntmax=10
while [ ${cnt} <= ${cntmax} ]
@ pcnt = ${cnt} - 1
istep=${prod_step}_${cnt}
pstep=${prod_step}_${pcnt}
if [ ${cnt} == 1 ] then
pstep=`printf ${equi_prefix} 6`
gmx grompp -f ${prod_prefix}.mdp -o ${istep}.tpr -c ${pstep}.gro -p topol.top -n index.ndx
else
gmx grompp -f ${prod_prefix}.mdp -o ${istep}.tpr -c ${pstep}.gro -t ${pstep}.cpt -p topol.top -n index.ndx
endif
gmx mdrun -v -deffnm ${istep}
@ cnt += 1
end
答え1
コードに複数のエラーがあります。これが何を意味するのか、それがうまくいくのか@
わかりません。異なるシェル間にはいくつかの構文の違いがあるので、などに使用される構文を見てください。csh
sh
bash
zsh
dash
以下はスクリプトに有効な構文ですsh
。
#!/bin/sh
init=step5_input
rest_prefix=step5_input
mini_prefix=step6.0_minimization
equi_prefix=step6.%d_equilibration
prod_prefix=step7_production
prod_step=step7
# Minimization
gmx grompp -f ${mini_prefix}.mdp -o ${mini_prefix}.tpr -c ${init}.gro -r ${rest_prefix}.gro -p topol.top -n index.ndx
gmx mdrun -v -deffnm ${mini_prefix}
# Equilibration
cnt=1
cntmax=6
while [ ${cnt} -le ${cntmax} ]; do
pcnt=$[ cnt - 1 ]
istep=$(printf ${equi_prefix} ${cnt})
pstep=$(printf ${equi_prefix} ${pcnt})
#One liner if statement:
if [ ${cnt} == 1 ]; then pstep=${mini_prefix}; fi
gmx grompp -f ${istep}.mdp -o ${istep}.tpr -c ${pstep}.gro -r ${rest_prefix}.gro -p topol.top -n index.ndx
gmx mdrun -v -deffnm ${istep}
((cnt += 1))
done
# Production
cnt=1
cntmax=10
while [ ${cnt} -le ${cntmax} ]; do
pcnt=$(( cnt - 1))
istep=${prod_step}_${cnt}
pstep=${prod_step}_${pcnt}
if [ ${cnt} -eq 1 ]; then
pstep=$(printf ${equi_prefix} 6)
gmx grompp -f ${prod_prefix}.mdp -o ${istep}.tpr -c ${pstep}.gro -p topol.top -n index.ndx
else
gmx grompp -f ${prod_prefix}.mdp -o ${istep}.tpr -c ${pstep}.gro -t ${pstep}.cpt -p topol.top -n index.ndx
fi
gmx mdrun -v -deffnm ${istep}
cnt=$[ cnt += 1 ]
done
しかし、
文の有効な構文はwhile
次のとおりです。
while [ expr ]; do
code
done
#Or
while [ expr ]
do
code
done
したがって、数値を比較するには、次を使用する必要があります。
-le
より小さいか等しいという意味-eq
同じことを意味-lt
より小さいという意味-ge
より大きいか等しいという意味-gt
より大きいという意味
もし
文の有効な構文はif
次のとおりです。
if [ expr ]; then
code
fi
#or
if [ expr ]
then
code
fi
数値の比較はexpr
exprと同じですwhile
。
計算
コードで数学演算を使用する方法はいくつかあります。このスクリプトでは、次の2つを使用しました。
sum=$[ expr ]
#E.g.
pcnt=$[ cnt - 1 ]
そして
sum=$(( expr ))
#E.g.
pcnt=$(( cnt - 1))
#or if you are not assign a value:
((expr))
#E.g.
((cnt += 1))
変数の設定
特定の変数を設定するときに次のコマンドを実行すると、スペースに注意する必要があります。
val = 10
これによりエラーが発生します。命令が見つかりません。したがって、有効な構文は次のとおりです。
val=10
val='something'
val="something"
val=$(command)
val="$(command)"
val=`command`
val="`command`"
出力を変数に割り当てるコマンドの実行に関しては、以下があります。
istep=`printf ${equi_prefix} ${cnt}`
使用する代わりに値=`command`
val=$(command)
より推奨されるものを使用する必要があります。
istep=$(printf ${equi_prefix} ${cnt})