我正在尝试使用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
然后停止。我的理解是,由于网站没有匹配,它应该执行当时的声明部分,但它结束了。我不熟悉脚本,也不知道我在做什么。所以任何帮助将不胜感激。
答案 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脚本。