- •§2 Unix Shell – лабораторные работы
- •Лабораторная работа №2: Написание скриптов. Практика использования Unix Shell. Обработка журнальных файлов.
- •Некоторые базовые элементы и средства языка Unix Shell
- •Конструкции языка Shell
- •Написание скриптов Unix Shell
- •Exit – завершение скрипта и выход. В качестве необязательного параметра можно указать код возврата. Подробнее см. Man exit.
- •Задание для выполнения лаб. Работы №2
- •Контрольные вопросы
Написание скриптов Unix Shell
Создание собственного скрипта
Скрипт представляет собой файл-сценарий, содержащий текст программы на языке Unix Shell. Файл должен начинаться с последовательности:
#!<путь и имя файла интерпретатора>
Например: #!/bin/bash
Далее следует текст программы. Для исполнения файл должен иметь права как минимум на чтение и (не обязательно) на исполнение (см. ниже)
Способы исполнения скрипта
Существует несколько способов исполнения скрипта на Unix Shell. Пусть например скрипт расположен в текстовом файле с именем prog.sh,
(Показан текст скрипта, выводящего одну строчку “This is test script”, скрипт находится в файле prog.sh)
[mike@bublik ~]$ cat prog.sh
#!/bin/bash
echo "This is test script!"
[mike@bublik ~]$
тогда возможны варианты:
Выполнить скрипт как обычную программу (необходимы права на чтение и исполнение файла, содержащего текст скрипта):
[mike@bublik ~]$ chmod +rx prog.sh
[mike@bublik ~]$ ./prog.sh
This is test script!
[mike@bublik ~]$ /home/mike/prog.sh
This is test script!
[mike@bublik ~]$
Выполнить так: “. <программа>” (необходимы только права на чтение файла со скриптом):
[mike@bublik ~]$ chmod 444 prog.sh
[mike@bublik ~]$ ls -la prog.sh
-r--r--r-- 1 mike teach 41 3 мар 03:42 prog.sh
[mike@bublik ~]$ . ./prog.sh
This is test script!
[mike@bublik ~]$
Передать текст скрипта на stdin интерпретатора, используя конвейер (необходимы только права на чтение файла со скриптом):
[mike@bublik ~]$ cat prog.sh | /bin/bash
This is test script!
[mike@bublik ~]$
Передать имя файла в качестве параметра интерпретатору (необходимы только права на чтение файла со скриптом):
[mike@bublik ~]$ bash prog.sh
This is test script!
[mike@bublik ~]$
Некоторые замечания
Небольшие скрипты удобнее разрабатывать непосредственно в командной строке, чем в файле, используя буфер команд:
набрать в командной строке цепочку команд
выполнить цепочку
посмотреть результат
не вводя заново все вернуть последнюю введенную команду из буфера
исправить/дополнить
и т.д. до тех пор, пока не будет работать без ошибок
При переносе скрипта из командной строки в текстовый файл часто возникает проблема «очень длинных строк». Unix Shell позволяет разбить длинную строчку (например с длинным конвейером) на короткие строки, используя в качестве разделителя знак обратного слеша “\” в конце каждой строки, кроме последней.
Например: last | grep -v -E "(^$|wtmp begins)" | tr -s " " | cut -f 1 -d " " | sort | uniq -c | sort -rnk1
можно при переносе в файл разбить на несколько строк таким образом:
last |\
grep -v -E "(^$|wtmp begins)" |\
tr -s " " |\
cut -f 1 -d " " |\
sort |\
uniq -c |\
sort -rnk1
Если разные команды находятся в файле в разных строчках, то ставить разделитель “;” после каждой команды необязательно.
Однострочный комментарий в скрипте начинается со знака #
Основные команды UNIX-подобных ОС (в дополнение к списку из Лаб. №1)
Для просмотра более подробной справки по команде можно выполнить:
command -- help
command -h
man command
КОМАНДЫ:
echo – вывод на экран строки, переданной в качестве параметра.
Параметры:
-e – включить режим интерпретации специальных последовательностей символов (“\n” – перенос строки, “\t ” – табуляция и т.д.)
-n – не переходить на след. строку
Пример: echo “test”; echo –e “test1\ntest2”
(вывести строки test, test1, test2 по одной на каждой новой строке)
read – чтение значений со стандартного ввода в переменную или массив
Параметры:
-e – рассматривать весь ввод как один элемент
-a – рассматривать весь ввод как массив элементов (разделители - пробельные символы). Создает переменную-массив и заполняет элементы массива значениями.
Пример: while read –a a; do echo “${a[0]} ${a[1]}”; done
(Считывает с stdin строки. Каждая итерация цикла – обработка одной строки. Строка считывается, разбивается на несколько элементов, разделителем считаются пробельные символы, элементы заносятся в массив “a”. В теле цикла на экран выводится нулевой и первый элементы массива)
test – многофункциональная программа для проверки на истинность различных условий (сравнение арифметических значений, сравнение строк, проверка существования файлов/папок, проверка типов файлов, проверка прав доступа, времени последнего изменения и т.д.). Используется в условном операторе, операторе выбора, в циклах, а также самостоятельно.
Синтаксис1: test <условие>
Синтаксис2: [ <условие> ]
Примечание: смотрите man test для получения информации о возможных параметрах
Пример: if [ “${STR}” == “YES” ]; then A=1; else A=2; fi
(Если значение переменной STR равно строке YES, то переменной А присвоить 1, иначе присвоить 2)
tr – многофункциональный редактор потока. Позволяет удалять символы, заменять одни символы другими, удалять дубликаты и т.д. Подробнее см. man tr.
Пример: echo “test string” | tr “s” “t” – замена в строке всех s на t
