CSH中的循环结构

时间:2014-11-24 00:47:42

标签: loops foreach csh

我是Unix脚本的新手。关于构造如何循环遍历多个变量,我有点困惑。我试图获取.grb2文件以及指定的所有日期和时间。这是我的剧本......

#!/bin/csh

set  fhrs="nl"
set  dd="09 10 11 12 13 14"
set  runs="00 06 12 18"

foreach fhrs ($fhrs)
foreach dd ($dd)
foreach runs ($runs)

wget http://nomads.ncdc.noaa.gov/modeldata/cmd_pgbh/2004/200408/200408$dd/pgbh$fhrs.gdas.200408$dd$runs.grb2

end
end
end

我的输出经历了第一次迭代,即dd = 9,并且run = 00到runs = 18。一旦它到达终点,它就会在剩余的日期(dd)中运行= 18。如何让它循环回来重新开始?有没有"继续" csh中的陈述?我需要添加if语句吗?我尝试过嵌套foreach并设置语句,但这并不起作用。任何指导将不胜感激!谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定您使用fhrs变量尝试完成的任务。

意识到您在顶部只有一个循环值fhrs。把它移到最里面的循环,你应该看到其他循环" fire"如你所愿。

此外,您应该为所有迭代器变量使用不同的名称,例如

foreach f_hrs ($fhrs)
foreach d_d ($dd)
foreach r ($runs) 

编辑这是因为每次循环为变量分配内容时,它会破坏之前的内容(在循环结束时)。您使用相同的名称来保存列表以及每个循环使用的唯一值,因此对于runs案例,您可以从

开始
runs="00 06 12 18"
runs="00"
runs="06"
runs="12"

并且在处理runs的最后一个循环中(以及对于dd循环的下一次运行(现在也被删除),你只有

runs="18"

因此,下次执行runs循环时,您只能获得runs="18"

如果你转身,你会很容易看到这种情况 在csh调试/跟踪上查看如果使用

进行的操作
#!/bin/csh -vx

或者只是改变(暂时)到

echo wget ..

如果这没有帮助,请添加一个特殊的调试行,如

echo 200408$dd/pgbh$fhrs.gdas.200408$dd$runs.grb2

并在问题中添加最后6行输出以说明您的问题。

最后,是的,csh有一个continuebreak语句在循环中工作。有关整个故事,请参阅csh flow control

IHTH。