我是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并设置语句,但这并不起作用。任何指导将不胜感激!谢谢!
答案 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有一个continue
和break
语句在循环中工作。有关整个故事,请参阅csh flow control。
IHTH。