"구문 오류: 예기치 않은 파일 끝"을 방지하기 위해 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.

계산
코드에서 수학 연산을 사용할 수 있는 방법은 여러 가지가 있습니다. 이 스크립트에서는 다음 두 가지를 사용했습니다.

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

관련 정보