2013-05-23 3 views
0

У меня есть цикл if, который не совсем делает то, что он должен. Я хочу, чтобы цикл if искал конкретный файл «if (-f JUN * [0-9] .acc $ RUN.nc)», и если он находит его, продолжайте делать отступы. Если нет, он должен спрыгнуть через конец и продолжить чтение скрипта.странное поведение оператора If в (t) csh

На данный момент он ищет файл ok (он смог пройти первый оператор «if» и сделать правильные вещи, когда найдет первый файл), но как только он не найдет что он ищет, он останавливает весь сценарий и возвращает ошибку:

DEC * [0-9] .accE01Ccek0kA.nc: Совпадений нет.

Я пробовал различные комбинации if: ... else: pass и 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 использует csh вместо bash для выполнения скрипта (bash уже терпит неудачу, если встретится с линией 'setenv'). Тэг «bash» неверен. – Uwe

ответ

1

Вы используете csh или tcsh вместо bash, и несколько иррациональное поведение, которое вы только что обнаружили, является одной из причин не использовать csh для программирования. И их больше. Much more. Итак, пожалуйста: Когда вы пишете сценарий оболочки, никогда не используйте (t) csh. Используйте bash, ksh, dash, zsh или обычный старый sh; они все намного лучше подходят для этой задачи. Да, синтаксис заметно отличается от 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

Если это не так, как в bash. это должно быть примерно так:

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

И да, пожалуйста, проконсультируйтесь с уже имеющимися онлайн-ресурсами по таким вопросам. Не похоже, что на этом сайте нет ни одного веб-сайта.

+0

И имейте в виду, что этот код будет работать только в том случае, если есть файл _at most one_, который соответствует шаблону. Если есть два или более файлов, вы получите синтаксическую ошибку. Вам нужно что-то более сложное в этом случае, например, присвоение массива 'FILES = (JUN * [0-9] .acc $ RUN.nc);' затем следует тест 'if [-f" $ {FILES [0] } "]; затем'. – Uwe

+0

Весь сценарий не bash. Если вы используете bash для запуска этого скрипта, вы получите 'bash: setenv: command not found'. – Uwe

0

В csh если Glob, такие как DEC*[0-9].accE01Ccek0kA.nc не совпадает файл, то вы получите ошибку No match. Это означает, что вы в значительной степени не можете использовать -f с глобусом.

Вы много лучше использовать bash для сценариев из-за многочисленных проблем, как это. Однако, если вы должны использовать csh вы можете получить за эту конкретную причуду включения:

set nonomatch 

прежде чем использовать любые шарики.

Смежные вопросы