2. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 1
3. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 2
4. stdin, stdout, stderr
C каждым процессом связаны потоки ввода‑вывода ‑ файловые
дeскрипторы stdin, stdout, stderr.
Пример. Номера файловых дeскрипторов и устройств.
1 echo / dev / std*
2 echo / dev / std* | xargs −t −n 1 readlink
3 lsof −ap $BASHPID −d 0 ,1 ,2
Linux administration course. 2
6. Конвееры
STDIN process STDIN processSTDIN process
STDERR
STDERR
STDERR
STDOUT STDOUTSTDOUT
• Каждое приложение открывает 3 стандартных файловых
дескриптора (file descriptor) stdin (fd 0), stdout(fd 1), stderr
(fd 2)
• Приложения могут работать как фильтр из STDIN в
STDOUT, можно объединять несколько приложений в
конвейер
• Синтаксис <app1> | <app2>
Linux administration course. 3
7. Перенаправления в файл
• Перенаправление stdout FD=1
• С созданием нового файла
command > file или command 1> file
Например cat file1 file2 > file3
• С дополнением существующего
command >> file
Linux administration course. 4
8. Перенаправления в файл
• Перенаправление stdout FD=1
• С созданием нового файла
command > file или command 1> file
Например cat file1 file2 > file3
• С дополнением существующего
command >> file
• Перенаправления stdin FD=0
command < file или command <&0 file
Linux administration course. 4
9. Перенаправления в файл
• Перенаправление stdout FD=1
• С созданием нового файла
command > file или command 1> file
Например cat file1 file2 > file3
• С дополнением существующего
command >> file
• Перенаправления stdin FD=0
command < file или command <&0 file
• Перенаправления stderr FD=2
command1 2>&1 | command2
command 1>file 2>&1
command 2>file 1>&2
Linux administration course. 4
10. Применение перенаправления потоков.
Работает с любым типом файлов.
• Создать новый файл или обнулить сущствующий >
• Перенаправить длинный вывод команды в файл >
• Молчаливое выполнение команды >/dev/null
• Чтение из спецфайла </dev/urandom, /dev/zero
• Чтение из данных из файла <
• Настройка системы. echo > определенные файлы в /proc/
или /sys/
• cat /dev/zero > /dev/sda ‑ удалить систему
Linux administration course. 5
11. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 6
12. Основные конструкции для циклов
• for ‑ цикл просмотра (foreach), цикл со счетчиком
• while, until ‑ цикл с предусловием
• break, continue ‑ досрочный выход, пропуск итерации
Linux administration course. 6
13. Циклы for. Примеры.
Действие над файлами.
1 f o r file in *
2 do md5sum $file
3 done
Перечисление элементов.
1 f o r planet in Mars Earth Mercury Saturn
2 do ssh $planet uname −a > $planet
3 done
Linux administration course. 7
14. Циклы for. Цифровая последовательность.
Примеры генерации.
1 f o r num in 1 2 3 4 5 6 7 8 9 10 # простое
перечисление
2 do ping 1 9 2 . 1 6 8 . 1 0 . $num
3 done
4
5 f o r num in $ ( seq 1 10) # генерация из внешней
команды
6 do ping 1 9 2 . 1 6 8 . 1 0 . $num
7 done
8
9 f o r num in { 1 . . 1 0 } # генерация встроенными
средствами
10 do ping 1 9 2 . 1 6 8 . 1 0 . $num
11 done
Linux administration course. 8
15. Циклы for. Цифровая последовательность.
Арифметический формат (C‑like)
1 f o r ( ( i =1; i <11; i ++) )
2 do
3 echo $i
4 done
Несколько переменных
1 f o r ( ( a =1 , b =1; a <= LIMIT ; a ++ , b ++) )
2 do
3 echo −n ”$a−$b”
4 done
Linux administration course. 9
16. Циклы for. Выход из цикла.
Пустые выражения. Результат по умолчанию 1.
1 f o r ( ( i =1; ; i ++) )
2 do
3 echo $i
4 [ ” $ i ” −eq 10 ] && break
5 done
Linux administration course. 10
17. Циклы while,until
1 while expr1 ; . . . exprN
2 do
3 op
4 done
Применяются когда нужно повторять до выполнения какого‑то
события, когда количество элементов неизвестно заранее
либо изменяется динамически.
Например oкончание файла, получен последний аргумент
командной строки, ввод текста пользователем, ожидание хоста
в сети после презагрузки.
Linux administration course. 11
18. Примеры использования while
Перебираем аргументы.
1 while [ [ −n $1 ] ]
2 do
3 echo $1
4 s h i f t # rename the p o s i t i o n a l parameters
$N +1 , $N+2 . . . to $1 , $2 (N=1)
5 done
Linux administration course. 12
19. IFS ‑ internal field separator
IFS
Переменная, регулирующая разделение параметров
(аргументов) на слова.
Используется:
• во время раскрытия параметров командной строки перед
выполнением
• редактирование командной строки (удаление слова,
Ctrl+W)
• чтение ввода пользователя командной read
Значение по умолчанию: "<пробел><табуляция><перевод
строки> "
Linux administration course. 13
20. Перенаправление из цикла.
Парсер.
1 while IFS=” : ” read name pass uid guid comment
home shell ; do
2 echo $name $uid $guid $home $shell
3 done < / etc / passwd
Построчное чтение из файла.
1 while IFS= read −r line ; do
2 printf ’%s n ’ ” $ l i n e ”
3 done < ” $ f i l e ”
Linux administration course. 14
21. Внешние команды.
Массовые операции с файлами аналог циклов
Команда find
1 find . −name ’ *. c ’ −exec stat { } ;
Команда xargs
1 echo / dev / std* | xargs −n1 readlink
Linux administration course. 15
22. Цикл until. Пример.
Ожидаем хост после перезагрузки.
1 u n t i l ping −q −c 3 $host 1 >/ dev / null 2>&1 &&
nc −z $host 22
2 do
3 sleep 1
4 echo unavailable ;
5 done
6
Linux administration course. 16
23. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 17
24. Функции
• Именованные
• Неименованные
Функции в shell могут использоваться как обычные программы,
которые:
• Принимают позиционные параметры;
• возвращают статус;
• Могут использоваться в качестве источника либо
приемника при перенаправлениях ввода/вывода.
Linux administration course. 17
26. Пример (начало)
1 # ! / bin / bash
2
3 function help {
4 echo ”Использование : $0 < string >”
5 e x i t 1
6 }
7
8 f1 ( ) {
9 echo Вызвана функция $FUNCNAME с $# аргументами
10 }
11
12 f2 ( ) {
13 while read str ; do
14 echo $ { FUNCNAME } : прочитана строка : $str
15 done
16 }
Linux administration course. 19
27. Пример (окончание)
1 [ $# −eq 0 ] && help
2
3 f1 ”$@”
4
5 { f o r ( ( i =0; i <5; i ++) ) ; do
6 echo $@
7 done } | f2
8
9 e x i t
Linux administration course. 20
28. Локальные переменные
Переменные объявленные с префиксом local видны только
внутри объявленного блока.
1 # ! / bin / bash
2
3 VAR= t e s t
4 f1 ( ) {
5 l o c a l VAR=test1
6 echo Function $ {
FUNCNAME } : VAR=$VAR
7 }
8 f2 ( ) {
9 VAR=test2
10 echo Function $ {
FUNCNAME } : VAR=$VAR
11 }
1 echo Before f1 : VAR=$VAR
2 f1
3 echo Before f2 : VAR=$VAR
4 f2
5 echo After f2 : VAR=$VAR
6
7 e x i t
Linux administration course. 21
29. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 22
33. Подстановка команд
Синтаксис:
• ̀command ̀
• $(command)
Задание
Присвоить переменной LIST результат выполнения команды ls
-1
Вывести на экран переменную LIST
Linux administration course. 23
34. Спецсимволы
• # – Вся строка после # является комментарием
• ; – Разделение команд
• : – NOP оператор (похож на встроенный вызов true)
• source или . – скрипт выполняется в текущем экземпляре
shell
Linux administration course. 24
35. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 25
36. Управляющие операторы
Можно делать цепочки команд:
command1 && command2 || command3
command1 && command2 && command3 && ...
Применение операторов && и ||:
• Изменяют поведение кода в зависимости от успешности
выполнения команд
• Объединяют команды
• Улучшают читаемость кода для простых проверок. Одна
строка vs три в if
• Но длинные цепочки сложно отлаживать и поддерживать
Linux administration course. 25
37. Command chain example
It only takes three commands to install Gentoo
Linux administration course. 26
38. Command chain example
It only takes three commands to install Gentoo
1 cfdisk / dev / hda && mkfs . xfs / dev / hda1 &&
mount / dev / hda1 / mnt / gentoo / && chroot / mnt
/ gentoo / && env−update && . / etc / profile &&
emerge sync && cd / usr / portage && scripts /
bootsrap . sh && emerge system && emerge vim
&& vi / etc / fstab && emerge gentoo−dev−
sources && cd / usr / src / linux && make
menuconfig && make install modules_install
&& emerge gnome mozilla−firefox openoffice
&& emerge grub && cp / boot / grub / grub . conf .
sample / boot / grub / grub . conf && vi / boot /
grub / grub . conf && grub && init 6
Linux administration course. 26
39. Command chain example
It only takes three commands to install Gentoo
1 cfdisk / dev / hda && mkfs . xfs / dev / hda1 &&
mount / dev / hda1 / mnt / gentoo / && chroot / mnt
/ gentoo / && env−update && . / etc / profile &&
emerge sync && cd / usr / portage && scripts /
bootsrap . sh && emerge system && emerge vim
&& vi / etc / fstab && emerge gentoo−dev−
sources && cd / usr / src / linux && make
menuconfig && make install modules_install
&& emerge gnome mozilla−firefox openoffice
&& emerge grub && cp / boot / grub / grub . conf .
sample / boot / grub / grub . conf && vi / boot /
grub / grub . conf && grub && init 6
That is the first one
Linux administration course. 26
40. Условные операторы && ||
Выполнить команды:
1 cd video && echo Exit code $? Is OK . I am
watching video .
2 mkdir video # запустить предыдущую команду еще
раз
Linux administration course. 27
41. Условные операторы && ||
Выполнить команды:
1 cd video && echo Exit code $? Is OK . I am
watching video .
2 mkdir video # запустить предыдущую команду еще
раз
Синтаксис:
command1 && command2
Oболочка выполняет command2 если успешно выполнилась
command1. Логическая операция И (AND)
Linux administration course. 27
42. Условные операторы && ||
Выполнить команды:
1 cd video && echo Exit code $? Is OK . I am
watching video .
2 mkdir video # запустить предыдущую команду еще
раз
Синтаксис:
command1 && command2
Oболочка выполняет command2 если успешно выполнилась
command1. Логическая операция И (AND)
Выполнить команды:
Linux administration course. 27
43. Условные операторы && ||
Выполнить команды:
1 cd video && echo Exit code $? Is OK . I am
watching video .
2 mkdir video # запустить предыдущую команду еще
раз
Синтаксис:
command1 && command2
Oболочка выполняет command2 если успешно выполнилась
command1. Логическая операция И (AND)
Выполнить команды:
1 cd video | | echo Exit code $ ? . Video is not
available
2 rmdir video # Удалим и повторим еще раз первую
команду .
Linux administration course. 27
44. Условные операторы && ||
Выполнить команды:
1 cd video && echo Exit code $? Is OK . I am
watching video .
2 mkdir video # запустить предыдущую команду еще
раз
Синтаксис:
command1 && command2
Oболочка выполняет command2 если успешно выполнилась
command1. Логическая операция И (AND)
Выполнить команды:
1 cd video | | echo Exit code $ ? . Video is not
available
2 rmdir video # Удалим и повторим еще раз первую
команду .
Linux administration course. 27
45. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 28
46. Включение режима отладки I
Используется команда set для активизации различных
режимов работы bash.
Включение режима производится с помощью ”‑”,
а отключение – ”+”.
Linux administration course. 28
47. Включение режима отладки II
Примеры включения режима отладки.
1 bash −x . / script . sh # опция командной строки
2
3 # ! / bin / bash −x # внутри скрипта опцией
4 [ . . script . . ]
5
6 # ! / usr / bin / env bash
7 set −x # внутри скрипта командой
8
9 # ! / usr / bin / env bash
10 [ . . irrelevant code . . ]
11 set −x # включаем отладку на часть кода
12 [ . . relevant code . . ]
13 set +x # выключаем отладку
14 [ . . irrelevant code . . ]
Linux administration course. 29
48. Ключи отладки команды set I
• set -v – вывод на экран исполняемой строки
1 set −v
2 echo $HOME
• set -x – вывод на экран исполняемой строки с
автоматической подстановкой значений переменных
1 set −x
2 echo $HOME
• set -n – проверка синтаксиса скрипта
1 bash −n t e s t . sh
Linux administration course. 30
49. Ключи отладки команды set II
• set -f – отключение генерации имен файлов с
использованием метасимволов (globbing)
1 echo ~ / . *
2 set −f
3 echo ~ / . *
Linux administration course. 31
50. Ключи отладки команды set III
• set -e – остановка выполнения скрипта, если какая‑либо
команда возвращяет errorstatus не равный 0
1 # ! / bin / bash
2
3 set −e
4 f a l s e | | true
5 echo Working
6 f a l s e
7 echo Still working
Linux administration course. 32
51. Отладочные переменные
$LINENO номер текущей строки
$FUNCNAME массив содержит имена всех функций из
стека вызовов. 0 элемент имя текущей
функции
$BASH_SOURCE массив содержит имена подключенных
файлов source
$SHLVL уровень вложенности интерпретатора
$PIPESTATUS массив статусов завершения всех команд
в pipe
Альтернативный вид PS4.
1 export PS4= ’ +( $ { BASH_SOURCE } : $ { LINENO } ) : $ {
FUNCNAME [ 0 ] : + $ {FUNCNAME [ 0 ] } ( ) : } ’
Linux administration course. 33
52. Стек вызовов
• caller [N] – функция выводит на экран номер строки,
имена функции и файла вызывающего скрипта
1 # ! / bin / bash
2 backtrace ( ) {
3 echo Backtrace :
4 f o r ( ( i=$SHLVL ; i >=0; i−−)) ; do
5 c a l l e r $i
6 done
7 }
8 f1 ( ) { echo Function $FUNCNAME at $LINENO &&
backtrace ; }
9 f2 ( ) { f1 ; }
10 f2
Linux administration course. 34
53. Типичные ошибки в условном выражении
Написать скрипт прнимающий один аргумент и
определяющий файл ли это. Если файл выводить на экран
строку ’regular file detected’ в случае успеха, Предварительно
создать: файлы c именами file, my file
check.sh ‑ исправить
1 filename=$1
2
3 [−f $filename ] && echo ” regular f i l e detected ”
| | echo ” not regular f i l e ”
4 e x i t # to run code below comment i t
5 # or v a r i a n t with i f
6 i f [−f $filename ] ; then
7 echo ’ re g ular f i l e detected
8 else
9 echo ” not regular f i l e ”
Linux administration course. 35
54. Сообщения об ошибках
Пример.
1 check . sh : line 4 : [−f : command not found
2
3 check . sh : line 4 : [ : missing ] ’
4
5 . / check . sh # i n c o r r e c t code l o g i c . No
arguments .
6 re g ular f i l e detected
7
8 . / check . sh : l i n e 5 : [ : my: binary operator
expected
9
10 . / check . sh : l i n e 112: syntax e r r o r : unexpected
end of f i l e
11
12 bash : t e s t : too many argumentsLinux administration course. 36
55. 1 Manipulate the different I/O streams with I/O Redirection
2 Repeat operations with loops.
3 Group pieces of code.
4 Expansions cont.
5 if alternatives.
6 Debugging scripts.
7 Command types.
Linux administration course. 37
56. Запуск программы из командной строки
• Находим приглашение командной строки $, #, user@host: $
• Вводим имя команды, аргументы и запускаем на
выполнение нажатием <Enter>
Что такое команды?
• исполняемая программа (бинарный файл, скрипт)
• встроенные в оболочку команды (shell built‑ins)
• функция оболочки
• сокращение команды (an alias)
Linux administration course. 37
57. Задание. Виды команд в оболочке
Команда type отображает тип команды. Выполним ее для
различных команд.
1 type type cd help a l i a s read
2 type dmesg rm
3 type i f
4 type −a ls
5 type −a echo pwd t e s t
Два типа команд. А оно нам надо? Есть ли разница?
Linux administration course. 38
58. Задание. Виды команд в оболочке
Команда type отображает тип команды. Выполним ее для
различных команд.
1 type type cd help a l i a s read
2 type dmesg rm
3 type i f
4 type −a ls
5 type −a echo pwd t e s t
Два типа команд. А оно нам надо? Есть ли разница?
Встроенные и внешние команды
• всегда присутствуют в интерпретаторе, внешних может и
не быть на диске
• однообразный синтаксис на разных платформах
(переносимость скриптов)
• как правило выполняются быстрее, т.к. код находится в
памяти
• есть средства, чтобы выключить встроенные команды,Linux administration course. 38
59. Условные операторы: case
1 case ” $ v a r i a b l e
” in
2 pattern1 )
command1
3
command2
4 ; ;
5 pattern2 |
pattern3 )
6
command3
7
command4
8 ; ;
9 esac
Linux administration course. 39
60. Условные операторы: case
1 case ” $ v a r i a b l e
” in
2 pattern1 )
command1
3
command2
4 ; ;
5 pattern2 |
pattern3 )
6
command3
7
command4
8 ; ;
9 esac
Пример:
1 # ! / bin / bash
2
3 cmd=$1 ; var=$2
4 case ”$cmd” in
5 −−print|−−echo )
6 echo ”Ура , печатаем ! ” ; ;
7 abc *| xyz *)
8 echo ”Странная команда $cmd”
; ;
9 *)
10 echo ”Я таких команд не
знаю : $cmd” 1>&2
11 e x i t 1 ; ;
12 esac
13 [ ! −z ” $var ” ] && echo ”
переменная $var = $var ”
14 e x i t 0Linux administration course. 39