0

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

目前,它正在寻找文件 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
4

3 回答 3

1

如果在 bash 中不是这样写的。它应该是这样的:

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

是的,请就此类问题查阅已有的在线资源。这不像是没有一个网站有这些东西。

于 2013-05-23T07:41:33.700 回答
1

您使用 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
于 2013-05-23T10:10:41.710 回答
0

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

由于这样的许多bash问题,您最好使用脚本编写。但是,如果您必须使用csh,您可以通过包括以下内容来克服这个特殊的怪癖:

set nonomatch

在使用任何 glob 之前。

于 2013-05-23T10:26:26.513 回答