Shell-программирование

advertisement
Shell-программирование
Пример shell-процедуры
$ cat myprog
#this is program myprog
date
ls -F
Выполнение процедуры myprog:
$ myprog
$
/usr/bin/sh
PID=1324
/usr/bin/sh
/usr/bin/date
myprog
#
date
ls -F
/usr/bin/ls
PID=1350
PID=1361
PID=1362
Передача данных shell-процедуре(1)
•Одним из способов передачи данных процедуре является их
передача через среду
Пример:
$ color=lavender
$ cat color1
echo You are now running program: color1
echo the value of variable color is: $color
$ chmod +x color1
$ color1
You are now running program: color1
the value of variable color is:
$ export color
$ color1
You are now running program: color1
the value of variable color is: lavender
Аргументы shell-процедур(1)
Командная строка:
$ sh_program
$0
arg1
arg2
$1
$2
...
arg23
${23}
Пример:
$ cat color3
echo You are now running program: $0
echo The value of command line argument \#1 is: $1
echo The value of command line argument \#2 is: $2
$ chmod +x color3
$ color3 red green
You are now running program: color3
echo The value of command line argument #1 is: red
echo The value of command line argument #2 is: green
....
argX
$X
Аргументы shell-процедур(2)
Пример:
Данная shell-процедура инсталлирует программу,
специфицированную как аргумент командной строки в каталог bin
пользователя.
$ cat > my_install
echo $0 will install $1 to your bin directory
chmod +x $1
mv $1 $HOME/bin
echo Installation of $1 is complete
$ chmod +x my_install
$ my_install color3
my_install will install $1 to your bin directory
Installation of color3 is complete
$
Специальные переменные shell: # и *(1)
#
Количество аргументов в командной строке
*
Строка, содержащая все аргументы командной строки (за
исключением $0)
Пример:
$ cat color4
echo There are $# command line arguments
echo They are $*
echo The first command line argument is $1
$ chmod +x color4
$ color4 red green yellow blue
The are 4 command line arguments
They are red green yellow blue
The first command line argument is red
$
Команда read(1)
Синтаксис:
read переменная [переменная...]
Пример:
$ cat color6
#This program prompts for user input
echo “Please enter your favorite two colors -> \c”
read color_a color_b
echo The colors you entered are: $color_b $color_a
$ chmod +x color6
$ color6
Please enter your favorite two colors -> read blue
The colors you enterd are: blue red
$ color6
Please enter your favorite two colors -> read blue tan
The colors you entered are: blue tan red
Команда echo и управляющие символы
•Это специальные управляющие символы, интерпретируемые
командой echo, которые обеспечивают управление строками.
•Эти символы интерпретируются командой echo, а не shell’ом.
Символ
\b
\c
\f
\n
\r
\t
\\
\nnn
Действие при печати
Возврат на один симол
Подавление перехода на новую строку
Перевод страницы
Новая строка
Возврат каретки
Символ табуляции
Обратный слэш
Символ, код ASCII которого nnn
shell-функции
Синтаксис:
function имя_функции {shell_текст}
или
имя_функции (){shell_текст}
Пример:
$ function install
>{
>
echo Install file:$1
>
chmod +x $1
>
mv $1 $HOME/bin
>
echo Install complete
>}
$ install myfile
Install file: myfile
Install complete
install()
{
echo Install file:$1
chmod +x $1
mv $1 $HOME/bin
echo Install complete
}
ветвления
Коды завершения
Переменная shell’а ? содержит код завершения последней
выполненной команды
0
команда выполнена без ошибки (true)
не 0
команда завершена в связи с ошибкой (false)
Пример:
$ true
$ echo $?
0
$ ls
$ echo $?
0
$ echo $?
0
$ false
$ echo $?
1
$cp
Usage : cp f1 f2
...
$ echo $?
1
$ echo $?
0
Команда test
Синтаксис:
test выражение
или
[ выражение ]
Команда test оценивает истинность выражения и формирует код
завершения.
Значение выражения
Код завершения
true
0
false
не 0 (обычно 1)
Команда test может оценивать истинность условия, в качестве аргументов
которого могут быть:
•целые числа
•строки
•файлы
Команда test ничего не пишет в стандартный вывод.
При вызове команды test вторым способом после открывающей и перед
закрывающей квадратными скобками должны быть пробелы.
Команда test:сравнение чисел
Синтаксис :
[ число отношение число ]
Отношения :
-lt
-le
-gt
-ge
-eq
-ne
Пример:
$ [ $X -lt 7 ]
$ echo $?
0
$ [ $X -gt 7 ]
$ echo $?
1
меньше
меньше или равно
больше
больше или равно
равно
не равно
Сравнивает числа в соответствии с
отношением
Команда test:сравнение чисел
Пример:
$ [ $XX -eq 3 ]
sh: test: argument expected
$ [ “$XX” -eq 3 ]
[ -eq 3 ]
[ “ “ -eq 3 ]
XX - NULL
Общим правилом является необходимость заключений в
двойные кавычки всех выражений вида $переменная, что
предотвращает неподходящую замену переменных shell’ом.
Команда test:сравнение строк
Синтаксис :
[ строка1 = строка2 ] Определяется эквивалентность строк
[ строка1 != строка2 ] Определяется неэквивалентность строк
Пример:
$ X=abc
$ [ “$X” = “abc” ]
$ echo $?
0
$ [ “$X” != “abc” ]
$ echo $?
1
После открывающей и перед закрывающей квадратными
скобками должны стоять пробелы.
Операторы сравнения строк
строка1=строка2
истина, если строки идентичны друг другу
строка1!=строка2
истина, если строки не идентичны друг другу
-z строка
истина, если строка нулевой длины
-n строка
истина, если строка ненулевой длины
строка
истина, если строка ненулевой длины
Заключение переменной в кавычки застрахует от появления
синтаксической ошибки
Пример:
$X=“Yes we will”
$[ $X = yes ]
вызывает синтаксическую ошибку,
интерпретируется shell’ом как [Yes we will = yes ]
$[ “$X” = yes ]
правильный синтаксис,
интерпретируется shell’ом как [“Yes we will” = yes ], и
сравнение осуществляется корректным образом.
Особенности сравнения чисел и строк
Shell трактует все аргументы как числа в случае, если
осуществляется сравнение чисел, и все аргументы как строки,
если осуществляется сравнение строк.
Пример:
$ X=03
$ Y=3
$ [ “$X” -eq “$Y” ]
$ echo $?
0
$ [ “$X” = “$Y” ]
$ echo $?
1
сравнивается число 03 с числом 3
истина, т.к. аргументы равны друг другу,
поскольку они числа
сравнивается строка «03» со строкой «3»
ложь, т.к. аргументы не равны друг другу,
поскольку они строки
Команда test: тестирование файлов
Синтаксис :
test -опция имя_файла
Опции:
-f имя_файла
-s имя_файла
-r имя_файла
-w имя_файла
-x имя_файла
-d каталог
Пример:
$ test -f file
$ echo $?
0
$ test -d file
$ echo $?
1
Оценивает характеристики имя_файла в
соответствии с опцией
истина, если файл существует и является обычным
файлом. т.е. не каталогом и не файлом устройства
истина, если файл существует и его размер больше 0
истина, если файл существует и доступен для чтения
истина, если файл существует и доступен для записи
истина, если файл существует и доступен для выполнения
истина, если файл существует и является именно
каталогом
или
[ -f file ]
или
[ -d file ]
Команда test: другие операторы
Синтаксис :
-o
OR
(ИЛИ)
-a
AND (И)
!
NOT
(НЕ)
\ ( \) ГРУППИРОВКА
Пример:
$ [ “$ANS”=y -o “$ANS”=Y ]
$ [ “$NUM” -gt 10 -a “$NUM” -lt 20 ]
$ test -s file -a -r file
$ test ! -d file
$ [ \( $# -eq 2 \) -a \ ( “$1” -eq “-m” \ ) -a \ ( -d “$2” -o -s “$2” \) ]
в этом примере проверяется истинность высказывания: «что имеются два аргумента в
командной строке» и «что первый аргумент командной строки есть -m” и “что
последний аргумент командной строки есть каталог или файл, размер которого
больше 0”
Между операторами, скобками и аргументами должны стоять
пробелы.
Команды exit и return
Синтаксис :
exit [аргумент]
•Завершает выполнение shell-программы и формирует код возврата.
•Если команда задана без аргументов, то код возврата устанавливается
равным коду возврата последней команды, выполненной перед exit.
return [аргумент]
•Останавливает выполнение функции и возвращает в вызвавшую процедуру
аргумент, содержащий код завершения.
•Если аргумент не указан, то код зовершения соответствует последней
команде, выполненной в функции перед выходом из нее.
•Когда прекращение выполнения функции обусловлено какими-то
внешними по отношению к ней причинами, то это равносильно exit.
Команды exit и return
Пример:
$ cat exit_test
echo exiting program now
exit 99
$ exit_test
exiting program now
$echo $?
99
$ cat rtn_test
function rtn
{
echo return from function
return 99
}
$ rtn_test
return from function
$echo $?
99
Конструкция if
Синтаксис:
(соответствует передаче управления на одну ветвь)
if
список_А
then
список_В
fi
Последовательность выполнения конструкции if:
1. Выполняются команды списка_А команд.
2. Если код завершения последней команды из списка_А равен 0 (ИСТИНА),
то выполняются команды из списка_В команд и затем команды, следующие
за fi.
3. Если код завершения последней команды из списка_А не равен 0 (ЛОЖЬ),
то выполняются команды, следующие за fi.
Блок-схема конструкции if
if
список_А
код завершения =0
then
список_В
fi
другие команды
код завершения не равен 0
Конструкция if-else
Синтаксис:
(соответствует передаче управления на одну из двух
возможных ветвей)
if
список_А
then
список_В
else
список_C
fi
Последовательность выполнения конструкции if-else:
1. Выполняются команды списка_А команд.
2. Если код завершения последней команды из списка_А равен 0 (ИСТИНА),
то выполняются команды из списка_В команд и затем команды, следующие
за fi.
3. Если код завершения последней команды из списка_А не равен 0 (ЛОЖЬ),
то выполняются команды из списка_С команд и затем команды, следующие
за fi.
Блок-схема конструкции if-else
if
список_А
код завершения не равен 0
код завершения =0
then
список_В
fi
другие команды
else
список_C
Конструкция if-else
Пример:
if
[ $X -lt 10 ]
then
echo X is less then 10
else
echo X is not less then 10
fi
Конструкция case
Синтаксис:
(соответствует передаче управления на одну из
множества возможных ветвей)
case слово in
образец1) список_А
;;
образец2) список_В
;;
образецN) список_N
;;
esac
Образцы задаются по формату имен файлов, сравнение основано на проверке
двух строк на абсолютно точное совпадение. Могут использоваться следующие
специальные символы:
*
сравнение любой строки символов, включая пустую
?
сравнение любого одиночного символа
[]
сравнение любого одного символа, помещенного между двумя
символами обеспечивает сравнение с любым, попадающим в этот
интервал
|
логический оператор OR («ИЛИ»)
Конструкция case
слово
образец 1
совпадение
список_А
несовпадение
слово
образец 2
несовпадение
совпадение
список_В
...
слово
образец N
несовпадение
esac
другие команды
...
совпадение
список_N
Конструкция case
Пример:
case $ANS in
yes) echo O.K.
;;
no) echo no go
;;
esac
case $OPT in
1) echo option 1 ;;
2) echo option 2 ;;
3) echo option 3 ;;
*) echo no option ;;
esac
Конструкция case: примеры задания образцов
В образцах конструкции case используются те же специальные символы, что
и для генерации имен файлов
Пример:
$ cat menu_with-case
echo
COMMAND MENU
echo
d to display time and date
echo
w to display logged-in users
echo
l to list contents of current directory
echo
Please enter your choice:
read choice
case $choice in
[dD]*) date
;;
[wW]*) who
;;
l*|L*)
ls
;;
*)
echo Invalid selection
;;
esac
$
Shell-программирование: ветвления.
Заключение.
Код завершения
Сравнение чисел
Сравнение строк
Тестирование файлов
exit n
if, if-else
case
Возвращает числовое значение после
выполнения каждой программы - echo $?
[ $число1 -lt $число2 ]
[ $строка1 = $строка2 ]
test -f имя_файла
Завершает программу и формирует код
завершения
Передача управления осуществляется на основе
анализа кода завершения последней команды
списка_А
Слово сравнивается с каждым образцом по
принципу сравнения строк
циклы
Введение в циклы
Назначение :
Повторное выполнение совокупности команд
Управление:
Основано на анализе кода завершения ключевой
команды
Три вида:
while...do...done
until... do... done
for... do... done
Конструкция while(1)
Повторение выполнения когда условие истинно.
Синтаксис:
while
список_А
do
список_В
done
Выполнение цикла while происходит следующим образом:
1. Выполняются команды списка_А.
2. Если код завершения последней команды из списка_А равен 0
(true), то выполняется список_В команд.
3. Возвращение к п.1.
4. Если код завершения последней команды из списка_А не равен 0
(false), то управление передается первой команде, следующей за
ключевым словом done.
Конструкция while(2)
while
список_А
код завершения не 0 false
код завершения 0
true
do
список_В
done
Конструкция while(5)
Пример:
Повторение выполнения цикла, когда имеются аргументы в
командной строке
while (( $# != 0 ))
do
if test -d $1
then
echo contents of $1:
ls -F $1
fi
shift
echo There $# items
echo left on the cmd line
done
Конструкция until(1)
Повторение выполнения тела цикла до тех пор, пока условие
истинно.
Синтаксис:
until
список_А
do
список_В
done
Выполнение цикла until происходит следующим образом:
1. Выполняются команды списка_А.
2. Если код завершения последней команды из списка_А не равен 0
(false), то выполняется список_В команд.
3. Возвращение к п.1.
4. Если код завершения последней команды из списка_А равен 0
(true), то управление передается первой команде, следующей за
ключевым словом done.
Конструкция until(2)
until
список_А
код завершения 0 true
код завершения не 0
false
do
список_В
done
Конструкция for(1)
Для каждого элемента из списка выполнение цикла повторяется,
после чего переменной присваивается значение следующего
элемента списка и так до тех пор, пока список не будет исчерпан.
Синтаксис:
for переменная in список
do
список_А
done
Выполнение цикла for происходит следующим образом:
1. Shell-переменной переменная присваивается в качестве значения первая
строка из списка.
2. Выполняются команды списка_А.
3. Shell-переменной переменная присваивается в качестве значения
следующая строка из списка.
4. Выполняются команды списка_А.
5. Цикл продолжается до тех пор, пока не будут исчерпаны все элементы из
списка.
Конструкция for(2)
for
переменная in список
присвоение переменной
значения следующего
элемента списка
do
список_А
done
список исчерпан
Использование в списке цикла аргументов
командной строки
Можно создать список цикла из аргументов командной строки
следующим образом:
for i in $*
do
cp $i $HOME/backups
done
или
for i
do
cp $i $HOME/backups
done
Конструкции break, continue, exit
break [n]
Прекращает текущее выполнение цикла и передает
управление первой (или с номером n) команде после
done.
continue [n]
Останавливает выполнение текущей итерации цикла
и передает управление на начало очередной (или с
номером n) итерации вложенного цикла.
exit [n]
Останавливает выполнение shell-программы и
формирует код завершения n.
сигналы и прерывания
Что такое сигнал?
Сигнал - некоторая переменная, передаваемая процессу, когда
наступает определенное событие
Сигнал
Событие
EXIT
Выход из shell’а
HUP
Зависание - посылается фоновому процессу при
выходе из системы
INT
<Ctrl>+<c> - прерывание
QUIT
<Ctrl>+<\> - прекращение работы (генерирует файл
ядра)
KILL
Уничтожение процесса
TERM
Прекращение работы программы
Команда kill передает сигнал, заданный в явном виде, процессу
kill [-s сигнал] идентификатор_процесса (PID)
Что такое прерывание?
Прерывание - способ захватывания сигналов, которые могут быть
посланы процессам, и выполнения в соответствии с видам сигнала
некоторого действия.
Программы обработки прерываний (обработчики прерываний) действия в ответ на прерывания.
Команда trap
Синтаксис :
trap ‘команды’ сигнал [ сигнал... ]
выполняются команды по
получении сигнала
• Команда trap может быть использована в shell-программах с целью
перехвата сигнала до того, как он удалит(уничтожит) процесс и выполнения
некоторого дополнительного или альтернативного действия.
• Команду trap следует применить для указания в явном виде сигналов и
связанных с ними соответствующх действий, которые должны быть
выполнены.
• Команды могут представлять собой список команд системы UNIX,
отделяемых ;. Можно бакже создать shell-программу, которая выполнит
требуемые действия и указать имя этой программы в качестве аргумента.
• Обычно команды trap помещаются в начале shell-программы. Сигналы о
прерывании определются shell’ом , когда он читает команду trap.
Прерывания активизируются по получении соответствующего сигнала.
Команда trap
Пример:
$ cat > mytrap
trap ‘echo bye; exit’ INT QUIT TERM
while true
do
echo hello
done
$ mytrap
hello
hello
hello
bye -------------------------------------- нажать <Ctrl>+<c>
$
Команда trap
Виды действий с сигналами прерываний :
• Перехват сигнала. Вместо прекращения выполнения процесса будут
выполнены указанные специальные команды.
• Игнорирование сигнала. Используется если shell-программа работает с
важными файлами и важно сохранить их содержимое, несмотря на
прерывание.
• Сбрасывание сигналов прерывания. После захвата или игнорирования
команда trap умолчанию.Обычно такое действие связано с завершением
процесса. Это не вызовет сброса прерываний по отношению к действиям,
которые были заданы раньше, чем задано игнорирование прерываеий.
Сигнал NULL посылается процессом при нормальном завершении. Он
используется для того, чтобы задать действие, которое должна выполнить
shell-программа после нормального завершения процесса.
Игнорирование сигналов прерывания
Синтаксис :
trap ‘ ’ сигнал [ сигнал... ]
Пример:
$ cat > mytrap2
trap ‘ ’ INT
while true
do
echo hello
done
$ mytrap2
hello
hello-------------------------------------- нажать <Ctrl>+<c> (проигнорирован)
hello
hello -------------------------------------- нажать <Ctrl>+<\> (проигнорирован)
$
Сигнал KILL не может быть проигнорирован!
Размещение команды trap в программе
Помещайте команду в начале программы для управления удалением
временных файлов, если выполнение программы прекращается:
trap ‘rm /tmp/tempfile;exit’ INT QUIT TERM
Помещайте команду перед критическим участком программы для
того, чтобы игнорировать возможные сигналы прерывания:
trap ‘ ‘ INT QUIT TERM
С помощью команды trap восcтанавливайте действие системы,
принятое по умолчанию, когда выполняется участок программы,
требующий нормального завершения:
trap INT QUIT TERM
Сигналы и прерывания: заключения
Сигнал
Выход из
системы
<Ctrl>+<c>
<Ctrl>+<\>
Логическая переменная, посылаемая shell-программе по
наступлении определенного события
EXIT - сигнал выхода
INT - сигнал прерывания
QUIT - прекращение работы
kill -s сигнал идент_процесса
Передача сигнала процессу с
номером идент_процесса
kill идент_процесса
Передача сигнала TERM процессу с
номером идент_процесса
Передача сигнала безусловного
уничтожения процессу с номером
идент_процесса
Перехват сигнала и запуск команды
Просмотр сигналов
kill -s KILL идент_процесса
trap ‘команды’ сигнал
stty -a
Download