2014-11-24 4 views
0

Я новичок в сценариях Unix. Я немного запутался в том, как конструкция работает для циклирования нескольких переменных. Я пытаюсь захватить файл .grb2 и для всех указанных дат и времени. Вот мой сценарий ....Looping Construct in CSH

#!/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 

Моего выход проходит через первую итерацию, а именно дд = 9 и работает = 00 через пробеги = 18. Как только он дойдет до конца, он просто выполняет пробеги = 18 для остальных дат (dd). Как мне получить его обратно и начать? Есть ли инструкция «continue» в csh? Нужно ли добавлять инструкцию if? Я попытался вложить foreach и установить утверждения, но это не сработало. Любое руководство будет принята с благодарностью! Благодаря!

ответ

0

Я не уверен, что вы пытаетесь выполнить с помощью переменной fhrs.

Осознайте, что у вас есть только одно значение цикла в верхней части, fhrs. Переместите это к внутреннему циклу, и вы должны увидеть другие циклы «огонь» по мере необходимости.

Кроме того, вы должны использовать разные имена для всех переменных итератора, как

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.

+0

У меня не должно было быть петли $ fhrs, поэтому я взял это. Но я все еще смущен тем, как работает цикл. Если он не работает, например, dd = 9, то цикл через часы. После того, как он достигнет последнего часа 18, он должен перейти на следующий день (dd = 10) и повторить до достижения dd = 14 и hh = 18 ...Вместо этого код проходит через первое время, соответствующее 0900 0906 0912 0918, а затем он проходит через оставшиеся дни (dd) в последний час (18) как таковой, 1018, 1118, 1218, 1318, 1418. – user3521263

+0

См. Мои правки , Удачи. – shellter