1

我收到一个 if 语句错误,我不熟悉将 CShell 与数组和 if 语句一起使用。

我正在阅读的文件是

FGF 101001011000

我的代码是

#!/bin/csh
foreach year (1999 2000 2001)
foreach month (1 2 3 4 5)
echo "" > $year$month
if ($month == 1) then
    set letter = F
else if ($month == 2) then
    set letter = G
else if ($month == 3) then
    set letter = H
else if ($month == 4) then
    set letter = R
else if ($month == 5) then
    set letter = D
else 
    print "Fail"
endif
@ year2 = $year % 100
awk '{split ($2,b,""); if (b["'$month'"] == 1) print $1"'$letter'""'$year2'"}' fileRead >> newFile  
end
end

月份的值是字符串还是数字,我可以直接将该值与 1 的值进行比较吗?即使我之前说过 set ,我是否每次使用 letter 时都需要包含 set ?if 语句在 CShell 中如何工作?CShell 中的数组是否像在 java 中那样工作?我知道在java中我会做第1个月,但是,从我的研究中我读到数组从1开始而不是0。这是真的吗?谁能告诉我为什么会出现 if 错误?

4

1 回答 1

1

(您的标题是csh,但您已将其标记为rc-shell。请注意 的关注者数量较少rc-shell。还有一个稍微更新的tcsh变体,它比原始版本具有更多的交互功能,csh并且似乎仍有追随者)

月份的值是字符串还是数字,我可以直接将该值与 1 的值进行比较吗?

csh数据只有一种类型,那就是字符串。您可以调用理解字符串化数字的外部程序,例如bc, dc,当然还有语言awk, perl,python等,但是当您将值传递给要处理的程序时,它是一个字符串。也就是说,您@正确使用了 csh 的“复杂赋值”语法。

如果你只是问,你能不能从一个名为 $month 的变量中减去 1,那么答案是肯定的,使用@ month-=1. 当 $month = "02" 时会发生什么?,不确定,只需进行测试,您就会看到 ;-)。

即使我之前说过 set ,我是否每次使用 letter 时都需要包含 set ?

是的,set是用于设置变量的 csh 语法的一部分

if 语句在 CShell 中如何工作?

?? 像任何其他语言一样?你知道他们是如何用另一种语言工作的吗?if如果先前的测试失败,它们只会被评估(并执行内部代码) 。

CShell 中的数组是否像在 java 中那样工作?我知道在java中我会做第1个月,但是,从我的研究中我读到数组从1开始而不是0。这是真的吗?

我很确定这csh是一个基于 1 的索引。不幸的是(或没有),我在家里或工作中都无法访问 csh,所以我无法进行简单的测试。只依靠你找到的证据。

谁能告诉我为什么会出现 if 错误?

如果没有看到您收到的确切错误消息,将很难判断。也有上下文将是有帮助的。幸运的是,您可以通过使用set -vx可用的调试/跟踪选项亲自看到这一点。如果脚本在该输出失败的地方可能更明显。或者,如果脚本根本拒绝运行,请注释掉脚本的大部分,只是为了让它运行,然后取消注释逻辑部分,直到找到有问题的代码部分。(如果您想发布确切的错误消息,请编辑您的问题以包含该消息,请不要作为对此答案的评论发布)。

IHTH

于 2013-07-09T22:58:42.897 回答