ые кавычки. Пример: пусть имеется командный файл f.csh: # !/bin/csh set a = 1 b = '`echo $v`' c = 3 echo a = $a b = $b c = $c set v = 100 @ b++ echo b = $b @ d = ( $a + $b + $c ) echo d = $d Первая строка начинается символом # - так в C-shell- программе обозначается строка-комментарий. Запись !/bin/csh указывает, что командный файл должен выполняться интерпрета- тором csh. В результате выполнения получим: % f.csh a = 1 b = `echo $v` c = 3 b = 101 d = 105 Здесь переменным a, b, c и v присваиваются различные значе- ния, которые затем используются в вычислениях в строках, - 21 - помеченных символом @. Все действия сопровождаются выводом значений переменных. В строке set b = '`echo $v`' перемен- ной b присваивается строка символов. Одиночные правые кавычки запрещают подстановку команде set и при выводе зна- чения b имеем: b = `echo $v`. В строке @ b++ выполняется команда `echo $v` (это значение переменной b к этому моменту), после чего значение переменной b увеличивается на 1. Величина b равна теперь 101 и используется далее. При выполнении подстановок особую роль выполняют фигур- ные скобки. Допустим, имеется необходимость осуществить конкатенацию значения переменной с некоторой последователь- ностью символов. Тогда, используя фигурные скобки, получим: % set a = 'Опер' % echo ${a}ционная система Операционная система % echo ${a}ция Операция % echo Исследование ${a}аций Исследование Операций Ниже перечислены все формы подстановок в различных режимах: $переменная или ${переменная} подставляется значение переменной; {} выделяют перемен- ную от других символов, идущих следом без разделителя; $переменная[номер] или ${переменная[номер]} подставляется слово номер из массива слов; $?переменная или ${?переменная} подставляется 1, если переменная определена, иначе 0; $$ подставляется десятичный номер процесса csh; $#переменная или ${#переменная} подставляется количество слов, хранящихся в массиве; $?0 или ${?0} подставляется 1, если входной файл определен, иначе 0; $0 подставляется имя файла, который в данный момент вре- мени выполняет интерпретатор; $число или ${число} эквивалентно $argv[число]; $* эквивалентно $argv[*], т.е. это строка параметров команды, которой был запущен csh. - 22 - Ниже приведены примеры различных вариантов использова- ния подстановок в командном файле f.csh. Показаны 23 раз- личных случая использования подстановок, каждый случай выде- лен строкой комментариев. За символом # в комментариях ука- заны номера вариантов. Чтобы легче было ориентироваться в выводе результатов, он организован таким образом, что сна- чала выводится номер варианта, потом результат его выполне- ния: - 23 - # !/bin/csh set m = ( w1 w2 w3 w4 w5 ) # 1 - 2 if( $?m ) then echo 1 $m else echo 2 0 endif # 3 - 4 if( ${?m} ) then echo 3 $m else echo 4 0 endif # 5 - 6 if( $?0 ) then echo 5 1 else echo 6 0 endif # 7 - 8 if( ${?0} ) then echo 7 1 else echo 8 0 endif # 9 echo 9 $$ @ p = ( $$ + 10 ) # 10 echo 10 $p date >&gt; ofile$$ # 11 echo "11 `ls ofile$$`" cat ofile$$ set p = 2 @ p++ # 12 - 17 echo 12 p = $p echo 13 ${p}aaa echo 14 $m[1] echo 15 $m[5] echo 16 $m[2-4] echo 17 ${m[3]}aaa # 18 - 23 set p = $#m echo 18 $p echo 19 ${#m}aaa echo 20 $0 echo 21 $3 echo 22 ${3}ddd echo 23 $* - 24 - Запустим на выполнение этот командный файл со следующим списком аргументов: 11 22 33 44 55 66. После выполнения получим: % f.csh 11 22 33 44 55 66 1 w1 w2 w3 w4 w5 3 w1 w2 w3 w4 w5 5 1 7 1 9 525 10 535 11 ofile525 Вос Июл 10 22:57:20 MSK 1988 12 p = 3 13 3aaa 14 w1 15 w5 16 w2 w3 w4 17 w3aaa 18 5 19 5aaa 20 f.csh 21 33 22 33ddd 23 11 22 33 44 55 66 Результаты всех вариантов, кроме 11, легко объяснимы. Здесь номер процесса используется для создания файла с уникальным именем. Этот прием часто используют, когда необходимо полу- чить такой файл. Варианты 20 - 23 демонстрируют использова- ние переменной argv. Эта переменная получает свое значение из командной строки f.csh 11 22 33 44 55 66, которую мы ввели при запуске командного файла. Конструкция $<&lt; используется для чтения строки с клавиа- туры дисплея. Если в списке переменных указана конструкция $<&lt;, то интерпретатор ждет ввода с клавиатуры дисплея и заме- няет $<&lt; на напечатанную строку - 25 - % set цвета = $<&lt; красный синий зеленый % echo $цвета красный синий зеленый % @ aaa = 1 + $<&lt; + 3 2 % echo $aaa 6 % echo $<&lt; красный синий зеленый красный синий зеленый % set цвета = ( красный синий зеленый $<&lt; серый ) белый % echo цвета: $цвета цвета: красный синий зеленый белый серый % echo $цвета[4] белый % set цвета[4] = $<&lt; голубой % echo $цвета[4] голубой В некоторых версиях интерпретатора csh конструкция $<&lt; не используется. В этом случае можно воспользоваться командой системы rline, например: % set a = `rline` ДЕМОС % echo $a ДЕМОС 1.7. Модификаторы переменных Часто бывает необходимо изменить значение переменной и использовать в подстановке измененное значение. Для измене- ния значений переменных используются так называемые модифи- каторы, которые предназначены в основном для манипуляций именами файлов и каталогов. Как правило, модификаторы запи- сываются в виде модифицируемое_слово:модификатор Ниже перечислены все формы использования модификаторов: h удалить имя файла, сохранив компоненты пути (то есть удалить в слове текст справа до ближайшего символа /); gh применить модификатор h глобально, ко всем словам; r удалить расширение имени файла, указанное через точку, и саму точку; - 26 - gr выполнить модификатор r глобально, ко всем словам; e удалить имя файла вместе с точкой, сохранив расширение имени; ge выполнить модификатор e глобально, ко всем словам; t сохранить имя файла, удалив компоненты пути (то есть удалить текст слева от самого правого символа / и сам этот символ); gt применить модификатор t глобально, ко всем словам; q запретить дальнейшую модификацию слова. Слово заключа- ется в кавычки; x разбить на слова по разделителям и запретить дальнейшую модификацию. Результат заключается в кавычки. Бессмысленно применять модификаторы к следующим синтак- сическим формам подстановок: $?переменная ${?переменная} $?0 $$ В каждой подстановке можно использовать только один модификатор. Перед модификатором должен стоять символ двое- точие. Если в подстановке используются символы {}, модифи- катор должен находиться внутри фигурных скобок. В командном файле f.csh показаны примеры использования модификаторов: - 27 - #!/bin/csh set a = /usr/bin/pr1 set b = /dir1/dir11/dir111/file.c set c = (/d/d1/d2/f.c /d/d1/c.c /d5/f.s ) # Вариант 1 echo 'Вариант 1' echo $a:h echo $b:h echo $c[1]:h echo ${c[2]:h} echo $c[3]:h # Вариант 2 echo 'Вариант 2' echo $a:t echo $b:t echo $c[1]:t echo ${c[2]:t} echo $c[3]:t # Вариант 3 echo 'Вариант 3' echo $a:r echo $a:e echo $b:r echo $b:e echo $c[1]:r echo $c[1]:e echo ${c[2]:r} echo ${c[2]:e} echo $c[3]:r echo $c[3]:e # Вариант 4 echo 'Вариант 4' echo $c:gh echo $c:gt echo $c:gr # Вариант 5 echo 'Вариант 5' set m = "$c:x" echo $m echo $m[1]:t echo $m[1]:r # Вариант 6 echo 'Вариант 6' set m = "$c:q" echo $m echo $m[1]:h echo $m[1]:r - 28 - После выполнения командного файла получим: % f.csh Вариант 1 /usr/bin /dir1/dir11/dir111 /d/d1/d2 /d/d1 /d5 Вариант 2 pr1 file.c f.c c.c f.s Вариант 3 /usr/bin/pr1 пустая строка нет расширения имени у файла pr1 /dir1/dir11/dir111/file c /d/d1/d2/f c /d/d1/c c /d5/f s Вариант 4 /d/d1/d2 /d/d1 /d5 f.c c.c f.s /d/d1/d2/f /d/d1/c /d5/f Вариант 5 /d/d1/d2/f.c /d/d1/c.c /d5/f.s f.s /d/d1/d2/f.c /d/d1/c.c /d5/f Вариант 6 /d/d1/d2/f.c /d/d1/c.c /d5/f.s /d/d1/d2/f.c /d/d1/c.c /d5 /d/d1/d2/f.c /d/d1/c.c /d5/f Вывод результатов организован таким образом, чтобы можно было отличить действия каждого варианта использования модификаторов. Варианты 5 и 6 демонстрируют действия моди- фикаторов x и q . Переменная c содержит список слов. Этот список присваивается переменной m и к нему поочередно приме- няются модификаторы x и q. Из примера видно, что этот спи- сок превращается в одно слово, и модификаторы h, t и r рабо- тают с этим списком как с одним словом. - 29 - 1.8. Выражения Символ @ в начале строки означает, что все указанные далее слова образуют выражение, например: % set a = 5 b = 7 % @ c = ( $a + $b ) % echo $c 12 В языке C-shell числом считается любая символьная строка, которая может интерпретироваться как целое десятич- ное число. Если в выражении применяется строка, которая не может интерпретироваться как число, порождается состояние ошибки. В качестве логических значений используются числа (0 - ложь и 1 - истина). Как истина воспринимается любое число, отличное от нуля. Выражения и операции в C-shell в основном аналогичны операциям в языке Си. Выражения можно использовать также в операторах if_then_else, while, exit. В выражение в качестве простого операнда можно включать команду системы, взятую в фигурные скобки. В процессе вычис- лений эта команда будет выполнена, и результат будет подс- тавлен в выражение. В выражениях используются следующие операции: операции сравнения строк == или =~ равно? != или !~ не равно? В качестве операндов в этих операциях применяются строки. В формах с символом ~ разрешается использовать в правой части шаблоны *, ? и [...]. Эта форма сравне- ния строк сокращает количество конструкций switch в командных файлах. операции над числами - 30 - операнд_целое_число: (два операнда): || или && и <&lt;= меньше или равно? >&gt;= больше или равно? >&gt; больше? <&lt; меньше? + сложить - вычесть * умножить / делить % остаток деления (один операнд): ++ инкремент, (постфиксная) -- декремент, (постфиксная) поразрядные_логические: & умножение | сложение ^ исключающее или ~ дополнение (унарная) ! отрицание (унарная) >&gt;>&gt; сдвиг вправо <&lt;<&lt; сдвиг влево операции опроса свойств файла: они записываются в виде -код имя_файла, где код - одна из следующих букв, обозначающих операцию: r (можно ли читать?) w (можно ли писать?) x (можно ли выполнять?) e (файл существует?) o (выполняющий владелец файла?) z (размер файла = 0 ?) f (файл зашифрован?) d (файл - это каталог?) Если файл обладает требуемым свойством, то возвращается значение истина, иначе ложь. Строка с выражением может иметь следующие форматы: символ @ распечатать значения всех переменных; @ имя операция_присваивания выражение присвоение переменной имя значения выражения; - 31 - @ имя[целое] операция_присваивания выражениe присвоение значения выражения элементу массива. Операции присваивания аналогичны подобным операциям языка Си: = += -= *= /= %= Порядок выполнения операций определяется либо по умолчанию, с учетом старшинства, либо явным указанием круглых скобок. В показанном ниже ряду операций старшинство операций растет слева направо: ||, &&, | , ^ , & , ==, !=, <&lt;=, >&gt;=, <&lt; , >&gt; , <&lt;<&lt;, >&gt;>&gt;, + , - , * , / , % , ! , ~ , ( ) Внутри указанных ниже групп операции имеют одинаковый прио- ритет: [ =~, !~, ==, != ] [ <&lt;, >&gt;, <&lt;=, >&gt;= ] [ <&lt;<&lt;, >&gt;>&gt; ] [ +, - ] [ *, /, % ] Все знаки операций и знак присваивания должны отде- ляться от операндов пробелами. Части выражений, содержащие знаки операций, необходимо брать в круглые скобки. Перед круглыми скобками и за ними должен идти пробел. Количество пробелов, знаков табуляции не ограничивается, эти символы являются только разделителями. Ниже приведен пример командного файла, содержащего строки с выражениями: - 32 - # !/bin/csh # вариант 1 set a = 5 @ a++ echo $a # результат: 6 # вариант 2 @ a = 7 echo $a # результат: 7 # вариант 3 set a = 10 b = 15 @ c = ( $a + $b ) echo $c # результат: 25 # вариант 4 @ c += 5 echo $c # результат: 30 # вариант 5 @ c = ( $c * 5 ) echo $c # результат: 150 # вариант 6 @ c *= 5 echo $c # результат: 750 # вариант 7 @ c *= $c echo $c # результат: -27324 # вариант 8 set a = 5 b = 7 c = 9 @ a = ( $a << 2 ) @ b = ( $b >> 2 ) @ c = ( $c + $a + $b ) echo $a $b $c # результат: 20 1 30 # вариант 9 set a = 5 b = 3 @ c = ( $a | $b ) echo $c # результат: 7 # вариант 10 - 33 - set a = 5 b = 3 c = 2 @ d = ( ( $a + $b ) + ( $a + $b + $c ) ) echo $d # результат: 18 # вариант 11 set a = 5 if( "$a" == "5" ) echo 'Строки идентичны' if( "$a" != "5" ) echo 'Строки различны ' # результат: Строки идентичны # вариант 12 date >&gt; file chmod 755 file if( -x file ) echo 'Выполняемый' # результат: Выполняемый Варианты 1 - 6 самообъяснимы. В варианте 7 получилось отри- цательное число, так как C-shell оперирует переменными типа integer (два байта на 16-разрядной ЭВМ). В выражениях можно использовать операции запроса свойств файла: % set c = 0 % @ c = -x a.out + 100 % echo $c 101 % @ c = 100 - -x a.out % echo $c 99 Можно указать в фигурных скобках простую команду. В качестве значения будет использован код возврата выполненной команды % @ c = 100 - { date } сре фев 3 14:48:37 МСК 1988 % echo $c 99 % @ c = { date rrrjjj } - 100 Дата: плохой формат % echo $c -100 Имеются полезные различия в операциях сравнения строк: - 34 - == != или =~ !~ В первом случае в правых частях сравнения не интерпретиру- ются шаблоны ? . * [...] во втором - интерпретируются. Пусть в рабочем каталоге име- ются файлы и каталоги, тогда % set c = "*" % if( "$c" == "*" ) _____ или % if( "$c" =~ "*" ) _____ В первом случае выражение всегда ложно - левая строка заме- няется списком имен файлов и каталогов, а правая остается без изменений (символ *). Во втором случае строки всегда идентичны - они одинаково интерпретируются. 1.9. Операторы языка C-shell Язык C-shell включает следующие операторы: foreach, switch, while, if_then_else, goto, continue, break, shift, exit. Операторы можно использовать в интерактивном режиме работы интерпретатора csh и в командном файле. Принципиаль- ных различий выполнения операторов в интерактивном режиме и в командном файле нет. Рассмотрим работу операторов в инте- рактивном режиме. В процессе ввода оператора интерпретатор приглашает символом ? продолжать набор, пока не встретит ключевое слово, означающее конец ввода. Введенный текст можно рассматривать как временный командный файл, который интерпретируется и после выполнения уничтожается. Одно из ключевых слов foreach, switch, while, if_then_else или goto должно быть первым словом в строке. Оператор цикла foreach foreach имя (список слов) ... end Переменной имя последовательно присваиваются значения каждого члена списка слов и выполняется последователь- ность команд тела цикла foreach. foreach и end должны находиться в отдельных строках - 35 - % foreach i ( a b c d e f g h ) ? if( "$i" == "c" ) continue ? glob "$i " ? if( "$i" == "f" ) break ? end a b d e f % Переменная цикла i последовательно принимает значения из списка, объявленного в предложении foreach. Внутри цикла стоят две проверки. Если значение i равно c, то перейти к следующему шагу цикла, если значение i равно f, то прекратить выполнение цикла. В первом случае оператор continue требует перехода к новой итерации цикла, во втором - оператор break осуществляет выход за пределы цикла, и его действие прекращается. Команда glob работает аналогично команде echo, но после вывода курсор остается в той же строке, а не в начале следую- щей. Оператор выбора switch имеет вид: switch(входная_строка) case образец: ... breaksw ... default: ... ... endsw Образцы вариантов case последовательно сравниваются с указанной в switch входной строкой (в образцах можно использовать шаблоны имен файлов *, ? и [...]). Если в варианте case выявлено совпадение образца и входной строки, выполняются все строки до ближайшего breaksw, default или endsw. Если совпадение не обнаружено, выполнение продолжается после default. Если default отсутствует, выполнение продолжается после endsw. Слова case и default должны быть первыми в строке. Выполнение оператора breaksw приводит к тому, что управление передается на первую строку после endsw - 36 - % set j = 0 % foreach i ( aaa bbb ccc ddd eee ) ? @ j++ ? switch( $i ) ? case "aaa": ? glob "$i " ? breaksw ? case "bbb": ? glob "$i " ? breaksw ? case "ccc": ? glob "$i " ? breaksw ? case "ddd": ? glob "$i " ? breaksw ? default: ? breaksw ? ? endsw ? glob "$j " ?end aaa 1 bbb 2 ccc 3 ddd 4 5 % Переменной цикла i присваиваются значения из списка в предложении foreach. Внутри цикла работает switch. Если ни одно значение вариантов case не совпадает со значением переменной i, то выполняется вариант default. В данном случае это приводит к выходу за пределы перек- лючателя switch, поэтому выводится порядковый номер итерации цикла и foreach выполняет следующую итерацию. В новой итерации цикла снова начинает действовать switch. Оператор if if(выр1) then ... else if(выр2) then ... else ... endif Если значение выр1 истинно (отлично от нуля), выполня- ются команды до первого else. Иначе, если значение выр2 истинно, выполняются команды до второго else и т.д. Возможно любое количество пар else if, endif нужно только одно. Часть else необязательна. Слова else и endif должны быть первыми в строках, где они указаны. Оператор if должен находиться один в строке или после else - 37 - % foreach i ( a b c d e f ) ? if( "$i" == "a" ) then ? glob "a " ? else if( "$i" == "b" ) then ? glob "b " ? else if( "$i" == "c" ) then ? glob "c " ? endif ? end a b c % На каждой итерации цикла foreach осуществляется про- верка текущего значения переменной цикла i с символами 'a', 'b' и выполняется, то на экран выводится соот- ветствующий символ, иначе осуществляется следующая ите- рация цикла. Оператор цикла while while(выражение) ... end Цикл выполняется, пока истинно значение выражения. Клю- чевые слова while и end должны находиться на отдельных строках. В цикле можно использовать команду break для выхода из цикла и команду continue для возобновления следующей итерации цикла без завершения текущей (все операторы цикла, следующие за командой continue, не будут выполняться) % set argv = ( 1 2 3 1 2 3 0 1 ) % while( $#argv > 0 ) ? if( "$argv[1]" == "3" ) then ? shift ? continue ? endif ? if( "$argv[1]" == "0" ) then ? break ? endif ? glob " $argv[1]" ? shift ? end 1 2 1 2 % Здесь выполняется цикл, в котором выводятся значения argv. Если значение argv[1] есть символ "3", то оно не выводится и идет переход к следующей итерации цикла, если символ "0", то действие цикла прекращается. Опера- тор shift освобождает (выталкивает) вершину стека для следующего элемента. В данном случае под стеком понима- ется список слов массива argv. После каждого сдвига argv[1] приобретает значение следующего слова. Цикл - 38 - while прекращает работу, когда список слов массива argv станет пустым, т.е. $#argv станет равным нулю. 1.10. Командные файлы Программы, написанные на языке C-shell, называют командными файлами. Каждая строка командного файла интерп- ретируется csh, в ней осуществляются подстановки, вычисля- ются, если необходимо, выражения. Командный файл может запускать на выполнение другие выполняемые файлы, в том числе командные файлы, написанные для интерпретаторов csh и sh. Кроме того, в командном файле доступна для выполнения любая команда системы. Каждый командный файл на языке C-shell должен начи- наться символом # в первой позиции первой строки, далее ука- зывается системное имя интерпретатора. Допускаются пустые строки. Строка, начинающаяся #, является строкой коммента- риев. При создании командных файлов, используя переменную argv, можно организовать ввод и обработку аргументов команд- ной строки, которые могут быть как именами файлов, так и любыми последовательностями символов. В качестве примера рассмотрим программу диалогового ввода содержания документа. Комментарии в программе достаточно полно раскрывают алгоритм работы - 39 - #!/bin/csh # Программа в режиме меню запрашивает # сведения о загрузке ЭВМ. Результат # ввода дописывается в файл Result. # Исправление ошибок ввода выполняется # повторным вводом. Запись в файл # происходит по команде Запомнить. # Переменная out используется для # указания направления вывода. Когда # out = /dev/tty вывод дописывается на # экран дисплея, когда out = Result # вывод дописывается в файл ./Result. set ЭВМ НОМ ОРГ ПОД set out = /dev/tty set мес = ( 0 0 0 0 0 0 0 0 0 0 0 0 ) set сум = ( 0 0 0 0 0 ) # Имена месяцев для подтверждения # режима ввода set имя = ( Январь Февраль Март \ Апрель Май Июнь \ Июль Август Сентябрь \ Октябрь Ноябрь Декабрь ) # Работа программы выполняется в # бесконечном цикле while(1) while ( 1 ) glob ' Укажите режим работы > ' set ответ = $<&lt; switch( "$ответ" ) case '[КкKk]': exit( 0 ) case '[ЗзZz]': set out = Result case '[ДдDd]': # Вычисление показателей по кварталам # и за год @ сум[1] = $мес[1] + $мес[2] + $мес[3] @ сум[2] = $мес[4] + $мес[5] + $мес[6] @ сум[3] = $мес[7] + $мес[8] + $мес[9] @ сум[4] = $мес[10] + $мес[11] + $мес[12] @ сум[5] = $сум[1] + $сум[2] + $сум[3] + $сум[4] # Очищать экран, если вывод не в файл - 40 - if( "$out" != "Result" ) clear # Команда echo выводит в файл out # значения переменных echo " \ Отчет о загрузке ЭВМ.\ ЭВМ $ЭВМ \ Заводской номер $НОМ \ Организация $ОРГ \ Подразделение $ПОД \ Январь $мес[1] \ Февраль $мес[2] \ Март $мес[3] \ Первый квартал $сум[1] \ Апрель $мес[4] \ Май $мес[5] \ Июнь $мес[6] \ Второй квартал $сум[2] \ Июль $мес[7] \ Август $мес[8] \ Сентябрь $мес[9] \ Третий квартал $сум[3] \ Октябрь $мес[10] \ Ноябрь $мес[11] \ Декабрь $мес[12] \ Четвертый квартал $сум[4] \ Итого $сум[5] " >> $out continue case '[АаAa]': glob 'Тип ЭВМ: ' set ЭВМ = $<&lt; continue case '[БбBb]': glob 'Заводской номер ЭВМ: ' set НОМ = $<&lt; continue case '[ВвWw]': glob 'Организация: ' set ОРГ = $<&lt; continue case '[ГгGg]': glob 'Подразделение: ' set ПОД = $<&lt; continue case '[1-9]': case "1[012]": glob $имя[$ответ]': ' - 41 - set мес[$ответ] = $<&lt; continue default: # Вывод меню, если режим указан неправильно. echo 'Такого режима нет.' clear echo ' \ \ \ \ \ \ Режимы работы: \ \ а Ввод наименования ЭВМ. \ б Ввод заводского номера ЭВМ. \ в Ввод наименования организации. \ г Ввод наименования подразделения. \ д Вывод данных на экран. \ з Запомнить. \ к Конец работы. \ Вывод загрузки в часах по месяцам: \ 1 Январь 2 Февраль 3 Март \ 4 Апрель 5 Май 6 Июнь \ 7 Июль 8 Август 9 Сентябрь \ 10 Октябрь 11 Ноябрь 12 Декабрь \ \ ' endsw end Ниже показано содержимое файла Result, который формирует программа. Эта же информация выводится на экран, если указан режим Вывод данных - 42 - Отчет о загрузке ЭВМ. ЭВМ СМ 1420 Заводской номер 1673 Организация Поликлиника 124 Подразделение ИВЦ Январь 300 Февраль 350 Март 350 Первый квартал 1000 Апрель 520 Май 330 Июнь 700 Второй квартал 1550 Июль 200 Август 150 Сентябрь 250 Третий квартал 600 Октябрь 300 Ноябрь 310 Декабрь 280 Четвертый квартал 890 Итого 4040 Часто возникает необходимость принять с клавиатуры ответ в виде метасимвола, который не должен интерпретиро- ваться. Этого можно достигнуть отменой специального значе- ния символа. В отдельных случаях такая отмена затрудни- тельна. Ниже приведен пример программы, в которой со стан- дартного ввода читаются метасимволы шаблонов имен файлов, но их специальное значение игнорируется. - 43 - # !/bin/csh # программа демонстрирует способ чтения # со стандартного ввода символов ? и *, # которые обычно рассматриваются как # шаблоны имен файлов и интерпретируются # while( 1 ) glob '=> ' set ответ = "$<&lt;" switch( "$ответ" ) case [?] : echo 'Вопросительный знак' breaksw case [*] : echo 'Звездочка' breaksw case '{' : case '}' : echo 'Фигурная скобка' breaksw default : echo 'Другой символ' endsw end 1.11. Протоколирование, средства работы с протоколом Интерпретатор записывает во временный файл протокол работы пользователя в виде списка выполненных командных строк. Количество запоминаемых командных строк определяется переменной history, которая обычно определяется в файле ~/.cshrc (о нем будет сказано ниже). Если установлена пре- допределенная переменная savehist, то по завершению сеанса работы пользователя указанное количество строк history будет сохранено в файле ~/.history. При следующем входе в систему содержимое этого файла используется для занесения в прото- кол. Например, если выполнена команда set savehist = 22 то последние 22 строки протокола будут сохранены в файле ~/.history и восстановлены в начале следующего сеанса работы. Чтобы напечатать протокол, необходимо выполнить команду history. Кажд