我有一个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
答案 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
在你使用任何球之前。