If statement 如果then语句崩溃,csh

If statement 如果then语句崩溃,csh,if-statement,csh,If Statement,Csh,我正在尝试使用csh编写一个脚本来检查我们的归档文件中的数据,如果数据不在那里,就可以输入它。我写了一个if-then语句来检查数据文件。看起来是这样的: if (! -e $site*d.Z) then cdraw2rnx set site = `echo $site | tr "[a-z]" "[A-Z]"` if (! -e $site*T00*) then echo "No data for" $site "exists in Archive"

我正在尝试使用csh编写一个脚本来检查我们的归档文件中的数据,如果数据不在那里,就可以输入它。我写了一个if-then语句来检查数据文件。看起来是这样的:

if (! -e $site*d.Z) then
    cdraw2rnx
    set site = `echo $site | tr "[a-z]" "[A-Z]"` 
    if (! -e $site*T00*) then
        echo "No data for" $site "exists in Archive"
    else 
        echo "Data Found"

    endif
else 
    echo $site "is Rinexed" 
endif
cdraw2rnx是另一个脚本

当我运行脚本时,它会到达这个if语句,然后返回

site*d.Z: no match

然后它停止了。我的理解是,由于站点没有匹配项,它应该执行语句的then部分,但它只是结束。我不熟悉脚本,不知道自己在做什么。因此,任何帮助都将不胜感激

在csh中,匹配失败是致命错误;这不仅仅导致条件为假

假设
$site
为“FOO”,则:

if (! -e $site*d.Z) then
将展开为名称以
FOO
开头并以
d.Z
结尾的所有文件的列表。如果有多个这样的文件,则会出现语法错误,因为
-e
只接受一个参数。如您所见,如果您没有,您的脚本将崩溃

不能使用通配符测试可能存在或不存在的文件

相反,您可以将
grep
与正则表达式一起使用(应该注意,正则表达式的语法和语义与通配符稍有不同)。例如(我没有测试过这个):

grep-c
打印与正则表达式匹配的行数。我在regexp上使用了双引号,以便变量
${site}
将被展开。我添加了花括号,以确保名称
站点
的结尾被识别(在这种情况下不需要,但这是一种良好的做法)。
^
$
确保正则表达式与整个文件名匹配

脚本的其余部分留作练习


当然,我不能不发布就讨论csh脚本。

我添加了一个csh标记,因为这至少看起来像一个csh脚本。如果这是不正确的,请用正确的标签更新,以表明您使用的是哪种语言。谢谢Kieth,它在cshAwesome中。感谢您花时间向我解释这一点以及csh脚本链接。这是一个很大的帮助。我会支持你的回答,但我在这里没有名声。@javery1289:你现在有多一点了。
set count = `ls | grep -c "^${site}.*d`.Z$"
if ($count == 1) then
    ....
endif