「構文エラー:予期しないファイルの終わり」を防ぐためにshスクリプトのこれらの行を修正する方法

「構文エラー:予期しないファイルの終わり」を防ぐために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

ベストアンサー1

コードに複数のエラーがあります。これが何を意味するのか、それがうまくいくのか@わかりません。異なるシェル間にはいくつかの構文の違いがあるので、などに使用される構文を見てください。csh
shbashzshdash

以下はスクリプトに有効な構文です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 [ expr ]; then
 code
fi

#or

if [ expr ]
then
 code
fi

数値の比較はexprexprと同じです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})

おすすめ記事