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

If statement (t)csh中If语句的怪异行为,if-statement,csh,If Statement,Csh,我有一个if循环,它没有完成它应该做的。 我希望if循环查找一个特定的文件“if(-f JUN*[0-9].acc$RUN.nc)”,如果找到了,继续执行缩进操作。 如果没有,它应该跳过endif并继续阅读脚本 目前,它正在查找文件ok(它已经能够通过第一个“if”语句,并在找到第一个文件时执行正确的操作),但一旦找不到要查找的文件,它就会停止整个脚本并返回错误: 十二月*[0-9]。accE01Ccek0kA.nc:不匹配 我已经尝试了多种组合的if:。。。否则:通过,如果。。。然后。。。在不

我有一个if循环,它没有完成它应该做的。 我希望if循环查找一个特定的文件“if(-f JUN*[0-9].acc$RUN.nc)”,如果找到了,继续执行缩进操作。 如果没有,它应该跳过endif并继续阅读脚本

目前,它正在查找文件ok(它已经能够通过第一个“if”语句,并在找到第一个文件时执行正确的操作),但一旦找不到要查找的文件,它就会停止整个脚本并返回错误:

十二月*[0-9]。accE01Ccek0kA.nc:不匹配

我已经尝试了多种组合的if:。。。否则:通过,如果。。。然后。。。在不同的地方用冒号等结束,但我还是不能让它工作

谢谢你的帮助

  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

在bash中,If不是这样写的。应该是这样的:

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

是的,关于这些问题,请参考已有的在线资源。这并不是说没有一个网站有这种东西。

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

csh
中,如果像
DEC*[0-9].accE01Ccek0kA.nc这样的glob未能匹配文件,则会出现
不匹配
错误。这意味着您几乎不能将
-f
与glob一起使用

使用
bash
编写脚本比使用好得多,因为有很多这样的问题。但是,如果您必须使用
csh
,您可以通过包括以下内容来克服这一特殊怪癖:

set nonomatch

在使用任何globs之前。

或者,在终端中键入
info bash
。顺便说一句:没有“if循环”这样的东西。如果
语句没有循环,则执行
。如果需要循环,请使用
while
@Mat显然Claire使用csh而不是bash来执行脚本(bash在遇到
setenv
行时已经失败)。“bash”标记是错误的。请记住,只有当最多有一个文件与该模式匹配时,此代码才会工作。如果有两个或多个文件,则会出现语法错误。在这种情况下,您需要更复杂的内容,例如数组赋值
FILES=(JUN*[0-9].acc$RUN.nc)后跟测试
if[-f“${FILES[0]}”;然后
。整个脚本不是bash。如果您使用bash运行此脚本,则会发现
bash:setenv:command未找到
。非常感谢!难怪我遇到了这么多问题——我甚至不知道我要用什么语言编写代码(我是从一个可以工作的脚本开始,并试图修改它)。从现在起,我将转到BASH,它似乎更有意义。谢谢你的帮助!!