2013-07-08 3 views
1

Я получаю сообщение об ошибке if, что я не знаком с использованием CShell с массивами и операторами if.Chsell with Arrays and Ifs

Мой файл, который я читаю это

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? Нужно ли включать набор каждый раз, когда я использую букву, хотя я уже сказал это раньше? Как делать, если инструкции работают в CShell? Как массивы в CShell работают так же, как в java? Я знаю, что в java я бы сделал месяц-1, однако из моих исследований я прочитал, что массив начинается с 1 и НЕ 0. Это правда? И может ли кто-нибудь сказать мне, почему я получаю ошибку if?

ответ

1

(Ваш заголовок говорит csh, но вы добавили это с rc-shell. Обратите внимание на небольшое количество последователей для rc-shell. Существует также несколько более новый tcsh вариант, который имеет больше интерактивных возможностей, чем оригинальный csh и, кажется, до сих пор a следующее)

Является ли значение месяца строкой или числом и могу ли я напрямую сравнить это значение со значением 1?

csh только имеет один тип данных, и это строка. Вы можете вызывать внешние программы, которые понимают строковые номера, такие как bc, dc и, конечно, языки, такие как awk, perl, python и т. Д., Но когда вы передаете значение программе, над которой нужно работать, это строка. Тем не менее, вы правильно используете синтаксис Csh @ «сложное задание».

Если вы просто просите, вы можете вычесть 1 из переменной с именем $ month, тогда ответ будет да, используя @ month-=1. Что произойдет, когда $ month = «02» ?, Не уверен, просто выполните тест, и вы увидите ;-).

Нужно ли включать набор каждый раз, когда я использую букву, хотя я уже сказал, что установлен раньше?

Да, set является частью CSH синтаксиса для установки переменной

Как сделать иначе, если заявления работать в CShell?

?? Как и любой другой язык? Вы знаете, как они работают на другом языке? Они только оцениваются (и код внутри выполняется), если предыдущий тест if не прошел.

Нужны ли массивы в CShell, как в java? Я знаю, что в java я бы сделал месяц-1, однако из моих исследований я прочитал, что массив начинается с 1 и НЕ 0. Это правда?

Я уверен, что csh - это индекс на основе одного. К сожалению (или нет), у меня нет доступа к csh либо дома, либо на работе, поэтому я не могу выполнить простой тест. Просто полагайтесь на доказательства, которые вы найдете.

И может ли кто-нибудь сказать мне, почему я получаю сообщение об ошибке?

Не видя точного сообщения об ошибке, которое вы получаете, будет трудно сказать. Также был бы полезен контекст. Напротив, вы можете это увидеть сами, используя опцию debug/trace set -vx. Если может быть более очевидным, когда скрипт терпит неудачу с этим выходом. ИЛИ, если скрипт отказывается запускаться вообще, закомментируйте большой сегмент скрипта, просто чтобы он его запустил, а затем раскомментируйте логические разделы, пока не найдете фрагментацию кода. (Если вы хотите опубликовать точную ошибку msgs, то, пожалуйста, отредактируйте свой вопрос, чтобы включить это, не публикуйте в качестве комментария к этому ответу, пожалуйста).

IHTH