Bash

如何更正這些 sh 腳本行以避免“語法錯誤:文件意外結束”

  • November 5, 2022
#!/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

所以如果你想比較數字,你應該使用:

  1. -le表示小於或等於
  2. -eq意味著等於
  3. -lt意味著少於
  4. -ge表示大於或等於
  5. -gt意味著比

If
語句 的有效語法if應該是:

if [ expr ]; then
code
fi

#or

if [ expr ]
then
code
fi

比較expr數字與whileexpr 相同。

數學運算

您有幾種方法可以在程式碼中使用數學運算,在這個腳本中我使用了兩種方法:

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})

引用自:https://unix.stackexchange.com/questions/723724