Bash
如何更正這些 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} <= ${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
您的程式碼包含幾個錯誤。
@
我不確定這是什麼意思,或者csh
這個是否有效。不同 shell 之間的語法存在一些差異,因此您應該查看
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
應該是:if [ expr ]; then code fi #or if [ expr ] then code fi
比較
expr
數字與while
expr 相同。數學運算
您有幾種方法可以在程式碼中使用數學運算,在這個腳本中我使用了兩種方法:
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
這將導致錯誤:command not found。所以有效的語法是:
val=10 val='something' val="something" val=$(command) val="$(command)" val=`command` val="`command`"
關於執行命令以將其輸出分配給我看到的變數:
istep=`printf ${equi_prefix} ${cnt}`
而不是使用**val=
command
**你應該使用val=$(command)
,這是更推薦的:istep=$(printf ${equi_prefix} ${cnt})