首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何纠正sh脚本的这些行以避免“语法错误:文件的意外结束”

如何纠正sh脚本的这些行以避免“语法错误:文件的意外结束”
EN

Unix & Linux用户
提问于 2022-11-05 01:41:42
回答 1查看 158关注 0票数 1
代码语言:javascript
复制
#!/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
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-11-05 03:13:15

您的代码包含几个错误。我不知道@csh中意味着什么,也不知道这个是否有效。不同的shell在语法上有一些不同,因此您应该看看shbashzshdash等中使用的语法。

这是sh脚本的有效语法:

代码语言:javascript
复制
#!/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语句的有效语法应该是:

代码语言:javascript
复制
while [ expr ]; do
 code
done

#Or
while [ expr ]
do
 code
done

因此,如果您想要比较数字,您应该使用:

  1. -le的意思是很少或等于
  2. -eq的意思是等于
  3. -lt意味着比
  4. -ge的意思是伟大或等于
  5. -gt的意思比

如果 if语句的有效语法应为:

代码语言:javascript
复制
if [ expr ]; then
 code
fi

#or

if [ expr ]
then
 code
fi

比较数字的exprwhile费用相同。

Math操作在代码中有几种使用数学操作的方法,在这个脚本中,我使用了两种方法:

代码语言:javascript
复制
sum=$[ expr ]
#E.g.
pcnt=$[ cnt - 1 ]

代码语言:javascript
复制
sum=$(( expr ))
#E.g.
pcnt=$(( cnt - 1))

#or if you are not assign a value:
((expr))
#E.g.
((cnt += 1))

Setting变量当您设置某个变量时,如果您运行的话,您必须小心使用空格:

代码语言:javascript
复制
val = 10

这将导致一个错误:命令找不到。因此,有效的语法是:

代码语言:javascript
复制
val=10
val='something'
val="something"
val=$(command)
val="$(command)"
val=`command`
val="`command`"

关于将它们的输出分配给一个变量的run命令,我看到您有:

代码语言:javascript
复制
istep=`printf ${equi_prefix} ${cnt}`

与其使用val=**`command`**,不如使用val=$(command),这更值得推荐:

代码语言:javascript
复制
istep=$(printf ${equi_prefix} ${cnt})
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/723724

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档