2013-05-23 2 views
0

나는 그것이해야 할 일을하고 있지 않은 if 루프를 가지고있다. if 루프가 특정 파일을 찾으려면 "if (-f JUN * [0-9] .acc $ RUN.nc)"를 찾고 찾으면 들여 쓰기를 계속하십시오. 그렇지 않으면 endif를 뛰어 넘어 스크립트를 계속 읽어야합니다.이상한 동작 if 문에서 (t) csh

지금은 파일 ok를 찾고 있습니다 (첫 번째 "if"문을 통과하고 첫 번째 파일을 찾을 때 올바른 작업을 수행 할 수 있음). 그러나 찾지 못하면 찾고자하는 것은 전체 스크립트를 멈추고 오류를 반환합니다 :

DEC * [0-9] .accE01Ccek0kA.nc : 일치하지 않습니다.

다음과 같은 다양한 조합을 시도했습니다. ... else : 패스 및 if ... then ... 콜론 등의 다른 위치에서 endif하지만 여전히 작동하지 않습니다.

도움 주셔서 감사합니다.

setenv RUN $1         # Run number 
    setenv BDIR /discover/nobackup/cekrause 
    setenv MONDATA $BDIR/$RUN/data_files # Target directory 
    setenv DATADIR $BDIR/$RUN     # Run directory 
    setenv EXECDIR /discover/nobackup/projects/giss/exec 

    cd $DATADIR 

    #### pdE JUN and DEC files #### 
    if (-f JUN*[0-9].acc$RUN.nc) then 
     mkdir tempplot 
     cp JUN*[0-9].acc$RUN.nc tempplot 
     cd tempplot 
     pdE JUN*[0-9].acc$RUN.nc 
    endif 

    cd $DATADIR 

    if (-f DEC*[0-9].acc$RUN.nc) then 
     mkdir tempplot 
     cp DEC*[0-9].acc$RUN.nc tempplot 
     cd tempplot 
     pdE DEC*[0-9].acc$RUN.nc 
    endif 

    (do some other things) 
    exit 
+0

또는 터미널에'info bash '를 입력하십시오. – devnull

+0

BTW : "if 루프"같은 것이 없습니다. 'if' 문은 반복하지 않습니다. 루프를 원하면'while'을 사용하십시오. – Uwe

+0

@Mat Claire는 스크립트를 실행하기 위해 bash 대신 csh를 사용합니다 (bash는'setenv' 행을 만나면 이미 실패합니다). "bash"태그가 잘못되었습니다. – Uwe

답변

1

bash 대신 csh 또는 tcsh를 사용합니다. 방금 발견 한 다소 비합리적인 동작은 프로그래밍에 csh를 사용하지 않는 이유 중 하나입니다. 그리고 그것들이 더 있습니다. Much more. 다음과 같이하십시오. 쉘 스크립트를 작성할 때 (t) csh를 사용하지 마십시오. bash, ksh, dash, zsh 또는 일반 old sh를 사용하십시오. 그들은 모두이 작업에 훨씬 더 적합합니다. 그렇습니다. 구문이 csh와 현저히 다르므로 스크립트의 일부를 다시 작성해야하지만 효과가 있습니다. 로 보여야 스크립트는 다음과 같습니다 csh에서

#!/bin/bash 

export RUN=$1         # Run number 
export BDIR=/discover/nobackup/cekrause 
export MONDATA=$BDIR/$RUN/data_files   # Target directory 
export DATADIR=$BDIR/$RUN      # Run directory 
export EXECDIR=/discover/nobackup/projects/giss/exec 

cd "$DATADIR" 

#### pdE JUN and DEC files #### 
if [ -f JUN*[0-9].acc"$RUN".nc ] ; then # note spaces around [, ], and semicolon before "then" 
    mkdir tempplot 
    cp JUN*[0-9].acc"$RUN".nc tempplot 
    cd tempplot 
    pdE JUN*[0-9].acc"$RUN".nc 
fi          # bash uses "fi" instead of "endif" 

cd "$DATADIR" 

if [ -f DEC*[0-9].acc"$RUN".nc ] ; then 
    mkdir tempplot 
    cp DEC*[0-9].acc"$RUN".nc tempplot 
    cd tempplot 
    pdE DEC*[0-9].acc"$RUN".nc 
fi 

(do some other things) 
exit 
+0

정말 고마워요!내가 너무 많은 문제를 안고 있었는지도 놀랄 일이 아니었다. 나는 어떤 언어를 코딩하려고했는지조차 알지 못했다. (나는 스크립트를 가지고 시작했고 그것을 수정하려고 시도했다.) 앞으로 BASH로 옮기 겠지만 훨씬 더 의미가있는 것 같습니다. 모든 도움에 감사드립니다 !! –

1

if는 bash에서 쓰지 않습니다.

if [ -f JUN*[0-9].acc$RUN.nc ] ; then 

예, 다음과 같은 질문에 대한 온라인 리소스를 참조하십시오. 이 물건이있는 웹 사이트가 하나도없는 것 같지 않습니다.

+0

그리고이 코드는 패턴과 일치하는 대부분의 one_ 파일이있는 경우에만 작동합니다. 두 개 이상의 파일이 있으면 구문 오류가 발생합니다. 이 경우에 더 복잡한 것이 필요하다. 예를 들어 배열 할당'FILES = (JUN * [0-9] .acc $ RUN.nc);''[-f "$ {FILES [0] } "]; 그때'. – Uwe

+0

전체 스크립트가 bash가 아닙니다. bash를 사용하여이 스크립트를 실행하면 'bash : setenv : command not found'가 표시됩니다. – Uwe

0

DEC*[0-9].accE01Ccek0kA.nc 등의 글로브 당신이 No match 오류가 다음 파일과 일치하지 않을 경우. 이것은 glob에 -f을 거의 사용할 수 없다는 것을 의미합니다.

당신 때문에이 같은 수많은 문제의 스크립트에 대한 bash을 개시 많은 더 낫다. 당신이 사용해야하는 경우, csh 다음을 포함하여이 특정 특질 과거를 얻을 수 있습니다

set nonomatch 

을 당신이 어떤 globs의를 사용하기 전에.