如果然后声明崩溃,csh

时间:2014-08-14 01:16:05

标签: 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"
    else 
        echo "Data Found"

    endif
else 
    echo $site "is Rinexed" 
endif

cdraw2rnx是另一个剧本。

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

site*d.Z: no match

然后停止。我的理解是,由于网站没有匹配,它应该执行当时的声明部分,但它结束了。我不熟悉脚本,也不知道我在做什么。所以任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在csh中,匹配失败是致命错误;它不仅会导致条件错误。

假设$site是“FOO”,那么:

if (! -e $site*d.Z) then

将展开到名称以FOO开头并以d.Z结尾的所有文件的列表。如果您有多个此类文件,则会出现语法错误,因为-e只接受一个参数。如果你没有,你的脚本会崩溃,如你所见。

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

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

set count = `ls | grep -c "^${site}.*d`.Z$"
if ($count == 1) then
    ....
endif

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

脚本的其余部分留作练习。

当然,如果不发布this link,我就无法讨论csh脚本。