(t)csh中If语句的奇怪行为

时间:2013-05-23 07:38:22

标签: if-statement csh

我有一个if循环,并没有完全按照它应该做的那样。 我希望if循环查找特定文件" if(-f JUN * [0-9] .acc $ RUN.nc)"如果找到它,继续做缩进的事情。 如果没有,它应该跳过endif并继续阅读脚本。

目前,它正在寻找文件ok(它已经能够通过第一个" if"语句并在找到第一个文件时做正确的事情),但是一旦找不到它要查找的内容,它就会停止整个脚本并返回错误:

DEC * [0-9] .accE01Ccek0kA.nc:不匹配。

我尝试了以下各种组合:...其他:传递,如果......然后......结束冒号等不同的地方,但我仍然无法让它发挥作用。

感谢您的帮助!

  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

3 个答案:

答案 0 :(得分:1)

如果在bash中没有这样写的话。它应该是这样的:

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

是的,请就这些问题咨询已有的在线资源。这并不像没有一个网站有这个东西。

答案 1 :(得分:1)

你使用csh或tcsh而不是bash,你刚刚发现的一些不合理的行为是不使用csh进行编程的原因之一。还有更多。 Much more.所以,请:当你编写shell脚本时,不要使用(t)csh。使用bash,ksh,dash,zsh或plain old 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

答案 2 :(得分:0)

csh中,如果DEC*[0-9].accE01Ccek0kA.nc之类的glob无法匹配文件,则会出现No match错误。这意味着你几乎不能将-f与glob一起使用。

最好使用bash编写脚本,因为这样的问题很多。但是,如果你必须使用csh,你可以通过包括:

来克服这个特殊的怪癖
set nonomatch

在你使用任何球之前。