【问题标题】:If then statement crashes, csh如果 then 语句崩溃,csh
【发布时间】:2014-08-14 01:16:04
【问题描述】:

我正在尝试使用 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 标签,因为这至少看起来像一个 csh 脚本。如果不正确,请使用正确的标签进行更新,以表明您使用的语言。
  • 感谢 Kieth 它在 csh 中

标签: if-statement csh


【解决方案1】:

在 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 打印匹配正则表达式的行数。我在正则表达式上使用了双引号,以便扩展变量 ${site}。我添加了花括号以确保名称 site 的结尾被识别(在这种情况下不是必需的,但很好的做法)。 ^$ 确保正则表达式匹配整个文件名。

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

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

【讨论】:

  • 太棒了。感谢您花时间向我解释这一点以及 csh 脚本链接。这是一个很大的帮助。我会赞成你的回答,但我在这里没有名声。
  • @javery1289:你现在还有一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2010-09-22
  • 2013-05-18
相关资源
最近更新 更多