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