Практическая работа по предмету UNIX
t;". Введите, например, такую
командную строку:
sort < pokupki
Команда sort выведет на экран (стандартный выход)
отсортированные строки файла pokupki:
apples
bananas
carrots
Фактически sort file-list
Эта командная строка перенаправила выходной поток команды ls в
файл file-list. При желании Вы можете убедиться в этом с помощью
команд cat или more.
Вторая команда сортирует содержимое файла file-list в указанном
порядке и выводит его на экран:
sort -r file-list
Такой способ не самый быстрый и требует создания временного
файла для сохранения результата работы команды ls.
shell предоставляет и другой вариант - использование "конвейера"
(pipeline). "Конвейер" - это замечательное свойство shell,
которое позволяет связать последовательность команд в конвейер,
где stdout первой команды посылается прямо на stdin второй
команды и так далее.
В нашем примере необходимо направить стандартный выходной поток
команды ls в стандартный входной поток команды sort. Символ "|"
обозначает конвейер. Поэтому Вам достаточно ввести:
ls | sort -r
и на экране появиться отсортированный список файлов и
подкаталогов. Эта командная строка намного короче и не требует
создания ненужных файлов.
Другой полезный пример.
Команда
ls /usr/bin
выдает на дисплей длинный список имен файлов, большинство из
которых слишком быстро исчезают с экрана, и Вы не успеваете
прочитать их. Подключите к просмотру перечня имен файлов
каталога /usr/bin команду more:
ls /usr/bin | more
Теперь Вы можете постранично листать файл в свое удовольствие.
Вы можете связать в конвейер более двух команд. В примере
используется команда head, которая отображает первые заданные
строки входного потока в стандартный выходной поток. Если Вы
хотите отобразить на экране последнее имя из списка текущего
каталога, упорядоченного по алфавиту, Вы можете ввести следующую
командную строку:
ls | sort -r | head -1
где head -1 просто выдает первую строку (-1) получаемого
входного потока (в данном случае это отсортированный в обратном
порядке перечень имен файлов текущего каталога, выданных
командой ls).
4. Перенаправление с добавлением.
Использование ">" для перенаправления выхода смертельно для файла, в
который происходит перенаправление (если этот файл уже существует).
Например,
ls > file-list
уничтожит прежнее содержимое файла file-list. Убедитесь, что теперь
файл file-list содержит лишь список имен файлов и подкаталогов
текущего каталога в алфавитном порядке, набрав команду
cat file-list
Если вместо ">" использовать символ перенаправления ">>", выходной
поток будет добавлен к содержимому указанного файла (а не записан на
место уже хранящейся в нем информации).
ls >> pokupki
В формате MS Word 97
1. Продолжение работы с shell.
1. Простейшие циклы shell.
Типичным считается цикл по последовательности имен файлов, и
оператор shell for является единственной структурой управления,
которую обычно задают с терминала, а не помещают в файл для
последующего выполнения. Синтаксис оператора for таков:
for переменная in список_слов
do
команды
done
Например, для вывода на экран имен файлов по одному на строке
достаточно задать следующий цикл:
for i in *
do
echo $i
done
Вместо i можно применять любую переменную shell, но это
обозначение традиционно. Заметьте, что обращение к переменной
задается с помощью $i, однако в заголовке цикла переменная
указывается как i. Значения переменной i определены шаблоном *
(для выбора всех файлов текущего каталога).
Выходной поток цикла можно перенаправить в файл, используя
символ перенаправления:
for i in *
do
echo $i
done > spisok
в результате будет создан файл spisok, содержащий список имен
файлов текущего каталога по одному на строке. Проверьте, так ли
это?
Выходной поток цикла можно направить и по конвейеру. Чтобы
получить на экране отсортированный список файлов достаточно
сделать следующее:
for i in *
do
echo $i
done | sort
Указав соответствующую опцию команды sort, Вы сможете
отсортировать список в нужном Вам порядке.
Всю последовательность команд цикла можно запускать в фоновом
режиме, указав в конце символ &. & применяется ко всякому циклу
и конвейеру.
Можно использовать другой формат для цикла for. Единственное
ограничение заключается в том, что do и done распознаются как
ключевые слова только в том случае, если они появляются сразу
после перевода строки или точки с запятой. В зависимости от
размера цикла for иногда лучше помещать его на одной строке:
for i in список_значений; do команды; done
Список аргументов для цикла for часто получают путем выбора имен
файлов по шаблону, но можно получать и любым другим способом, в
частности, просто вводом аргументов.
Например, ранее Вы создали ряд программ для печати в несколько
столбцов под именами 2, 3 и т.д. Все программы, кроме 2,
являются связями с файлом 2. Поэтому, если скрипт 2 создан, то
связи можно установить с помощью цикла for:
for i in 3 4 5 6 7 8; do ln 2 $i; done
Теперь Вы сможете выводить файлы в 3, 4, 5 , 6 , 7 и 8 столбцов.
2. Совершенствование команды саl.
shell позволяет сделать взаимодействие между пользователем и программой
более удобным. В качестве примера рассмотрим команду саl. Вы помните, как
используется эта команда: саl [month] year. Однако досадно, что месяц нужно
задавать числом:
саl october
Реакция программы на такую команду:
bad argument
(неверный аргумент).
К тому же команда
саl 10
выдает календарь на весь 10-й год, а не на октябрь текущего года. Поэтому
всегда следует указывать год, если Вы хотите получить календарь на один
месяц.
Вы можете изменить характер взаимодействия пользователя с программой саl,
не меняя самой программы.
Первый шаг разработки - определить функции усовершенствованной команды саl:
месяц нужно распознавать по названию;
при наличии двух аргументов команда должна делать то же, что делала прежняя
версия, за исключением перевода названия месяца в его номер;
в случае одного аргумента следует печатать календарь месяца или года (в
зависимости от того, что Вам требуется);
а при отсутствии аргументов - календарь текущего месяца, так как большей
частью именно для этого и обращаются к команде.
Поэтому задача сводится к тому, чтобы определить, сколько аргументов
задано, и преобразовать их в те параметры, которые требуются стандартной
команде cal.
shell имеет оператор case, который успешно применяется в таких ситуациях:
case слово in
шаблон) команды ;;
шаблон) команды ;;
…
esac
В операторе case значение слово сравнивается поочередно со всеми шаблонами
от начала до конца, и выполняются команды, связанные с первым (и только
первым) шаблоном, соответствующим слову. Шаблоны составляются по правилам
соответствия шаблонов, которые в некоторой степени обобщают правила задания
имен файлов. Каждое действие завершается двумя символами ;; (для последнего
варианта можно обойтись без ;;, но обычно их ставят для удобства
редактирования).
В новой версии команды саl определяется число заданных аргументов,
обрабатываются названия месяцев, затем происходит обращение к настоящей
команде саl.
В переменной интерпретатора $# хранится число аргументов, с которыми была
вызвана программа. Символ # в начале слова означает, что вся следующая за
ним строка рассматривается как комментарий.
В своем личном каталоге bin с помощью редактора vi создайте файл саl,
содержание которого следующее:
# cal: улучшенное взаимодействие с /usr/bin/cal
case $# in
0) set `date`; m=$2; y=$7;; # нет аргументов: использует текущие
1. m=$1; set `date`; y=$7;; # 1 аргумент: использует текущий год
*) m=$1; y=$2;; # 2 аргумента: месяц и год
esac
case $m in
jan* | Jan*) m=1;;
feb* | Feb*) m=2;;
mar* | Mar*) m=3;;
apr* | Apr*) m=4;;
may* | May*) m=5;;
jun* | Jun*) m=6;;
jul* | Jul*) m=7;;
aug* | Aug*) m=8;;
sep* | Sep*) m=9;;
oct* | Oct*) m=10;;
nov* | Nov*) m=11;;
dec* | Dec*) m=12;;
[1-9]|10|11|12) ;; # номер месяца
*) y=$m; m=" ";; # обычный год
esac
/usr/bin/cal $m $y # запуск настоящей команды
В первом операторе case проверяется число аргументов $# и выбирается
подходящее действие. Последний шаблон в этом операто
| | скачать работу |
Практическая работа по предмету UNIX |