Главная страница

вцуйф ауцй. Bash скрипты


Скачать 3.58 Mb.
НазваниеBash скрипты
Анкорвцуйф ауцй
Дата15.08.2022
Размер3.58 Mb.
Формат файлаpdf
Имя файлаbash.pdf
ТипРуководство
#646431
страница1 из 6
  1   2   3   4   5   6

Bash- скрипты, руководство в 11 частях Источник Перевод Читать онлайн (много полезных комментариев
Bash- скрипты начало
Bash- скрипты, часть 2: циклы
Bash- скрипты, часть 3: параметры и ключи командной строки
Bash- скрипты, часть 4: вводи вывод
Bash- скрипты, часть 5: сигналы, фоновые задачи, управление сценариями
Bash- скрипты, часть 6: функции и разработка библиотек
Bash- скрипты, часть 7: sed и обработка текстов
Bash- скрипты, часть 8: язык обработки данных awk
Bash- скрипты, часть 9: регулярные выражения
Bash- скрипты, часть 10: практические примеры
Bash- скрипты, часть 11: expect и автоматизация интерактивных утилит

1 скрипты начало

5 Как устроены скрипты
5 Установка разрешений для файла сценария
6 Вывод сообщений
6 Использование переменных
7 Переменные среды
7 Пользовательские переменные
8 Подстановка команд
8 Математические операции
9 Управляющая конструкция if-then
9 Управляющая конструкция if-then-else
11 Сравнение чисел
12 Сравнение строк
13 Проверки файлов
15 Итоги
16 скрипты, часть 2: циклы

18 Циклы for
18 Перебор простых значений
18 Перебор сложных значений
19 Инициализация цикла списком, полученным из результатов работы команды
19 Разделители полей
20 Обход файлов, содержащихся в директории
21 Циклы for в стиле C
22 Цикл while
23 Вложенные циклы
24 Обработка содержимого файла
24 Управление циклами
25 Команда break
26 Команда continue
27 Обработка вывода, выполняемого в цикле
27 Пример поиск исполняемых файлов
28 Итоги
29 скрипты, часть 3: параметры и ключи командной строки

30 Чтение параметров командной строки
30 Проверка параметров
31
Подсчёт параметров
32 Захват всех параметров командной строки
33 Команда shift
34 Ключи командной строки
35 Как различать ключи и параметры
36 Обработка ключей со значениями
37 Использование стандартных ключей
38 Получение данных от пользователя
39 Ввод паролей
40 Чтение данных из файла
41 Итоги
41

2 скрипты, часть 4: вводи вывод
43 Стандартные дескрипторы файлов
43
STDIN
43
STDOUT
43
STDERR
44
Перенаправление потока ошибок
44
Перенаправление потоков ошибок и вывода
45
Перенаправление вывода в скриптах
45 Временное перенаправление вывода
46 Постоянное перенаправление вывода
46
Перенаправление ввода в скриптах
47 Создание собственного перенаправления вывода
48 Создание дескрипторов файлов для ввода данных
49 Закрытие дескрипторов файлов
50 Получение сведений об открытых дескрипторах
50 Подавление вывода
52 Итоги
52 скрипты, часть 5: сигналы, фоновые задачи, управление сценариями
53 Сигналы Linux
53 Отправка сигналов скриптам
54 Завершение работы процесса
54 Временная остановка процесса
54 Перехват сигналов
55 Перехват сигнала выхода из скрипта
56 Модификация перехваченных сигналов и отмена перехвата
57 Выполнение сценариев командной строки в фоновом режиме
59 Выполнение скриптов, не завершающих работу при закрытии терминала
60 Просмотр заданий
60 Перезапуск приостановленных заданий
61 Планирование запуска скриптов
62 Удаление заданий, ожидающих выполнения
63 Запуск скриптов по расписанию
63 Запуск скриптов при входе в систему и при запуске оболочки
64 Итоги
65 скрипты, часть 6: функции и разработка библиотек
66 Объявление функций
66 Использование функций
66 Использование команды return
68 Запись вывода функции в переменную
69 Аргументы функций
69 Работа с переменными в функциях
72 Глобальные переменные
72 Локальные переменные
73 Передача функциям массивов в качестве аргументов
73 Рекурсивные функции
75 Создание и использование библиотек
76 Вызов функций из командной строки
76 Итоги
77

3 скрипты, часть 7: sed и обработка текстов
77 Основы работы с sed
78 Выполнение наборов команд при вызове sed
79 Чтение команд из файла
80 Флаги команды замены
80
Символы-разделители
82 Выбор фрагментов текста для обработки
83 Удаление строк
84 Вставка текста в поток
85 Замена строк
87 Замена символов
87 Вывод номеров строк
88 Чтение данных для вставки из файла
88 Пример
89 Итоги
90 скрипты, часть 8: язык обработки данных awk
91 Особенности вызова awk
91 Чтение скриптов из командной строки
91 Позиционные переменные, хранящие данные полей
92 Использование нескольких команд
93 Чтение скрипта awk из файла
94 Выполнение команд до начала обработки данных
94 Выполнение команд после окончания обработки данных
95 Встроенные переменные настройка процесса обработки данных
96 Встроенные переменные сведения о данных и об окружении
98 Пользовательские переменные
101 Условный оператор
101 Цикл while
103 Цикл for
105 Форматированный вывод данных
105 Встроенные математические функции
106 Строковые функции
107 Пользовательские функции
107 Итоги
108 скрипты, часть 9: регулярные выражения
109 Что такое регулярные выражения
109 Типы регулярных выражений
109 Регулярные выражения POSIX BRE
110 Специальные символы
111 Якорные символы
112 Символ точка
113 Классы символов
114 Отрицание классов символов
114 Диапазоны символов
115 Специальные классы символов
116 Символ «звёздочка»
116 Регулярные выражения POSIX ERE
118 Вопросительный знак
118

4 Символ плюс
119 Фигурные скобки
120 Символ логического или
121 Группировка фрагментов регулярных выражений
121 Практические примеры
122
Подсчёт количества файлов
122 Проверка адресов электронной почты
123 Итоги
124 скрипты, часть 10: практические примеры
125 Отправка сообщений в терминал пользователя
125 Команды who и mesg
125 Команда write
126 Создание скрипта для отправки сообщений
127 Проверка возможности записи в терминал пользователя
128 Проверка правильности вызова скрипта
129 Получение сведений о терминале пользователя
129 Отправка длинных сообщений
130 Скрипт для мониторинга дискового пространства
132 Итоги
135 скрипты, часть 11: expect и автоматизация интерактивных утилит
136 Основы expect
136 Автоматизация скрипта
136
Autoexpect
— автоматизированное создание скриптов
138 Работа с переменными и параметрами командной строки
139 Ответы на разные вопросы, которые могут появиться водном и том же месте
141 Условный оператор
142 Цикл while
143 Цикл for
143 Объявление и использование функций
144 Команда interact
145 Итоги
146

5 скрипты начало Сегодня поговорим о скриптах. Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, номы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux. Сценарии командной строки — это наборы тех же самых команд, которые можно вводить с клавиатуры, собранные в файлы и объединённые некоей общей целью. При этом результаты работы команд могут представлять либо самостоятельную ценность, либо служить входными данными для других команд. Сценарии — это мощный способ автоматизации часто выполняемых действий. Итак, если говорить о командной строке, она позволяет выполнить несколько команд за один раз, введя их через точку с запятой pwd ; whoami На самом деле, если вы опробовали это в своём терминале, ваш первый скрипт, в котором задействованы две команды, уже написан. Работает он так. Сначала команда pwd выводит на экран сведения о текущей рабочей директории, потом команда whoami показывает данные о пользователе, под которым вы вошли в систему. Используя подобный подход, вы можете совмещать сколько угодно команд водной строке, ограничение — лишь в максимальном количестве аргументов, которое можно передать программе. Определить это ограничение можно с помощью такой команды getconf ARG_MAX Командная строка — отличный инструмент, но команды вне приходится вводить каждый раз, когда в них возникает необходимость. Что если записать набор команд в файл и просто вызывать этот файл для их выполнения Собственно говоря, тот файл, о котором мы говорим, и называется сценарием командной строки. Как устроены скрипты Создайте пустой файл с использованием команды touch. В его первой строке нужно указать, какую именно оболочку мы собираемся использовать. Нас интересует bash, поэтому первая строка файла будет такой
#!/bin/bash В других строках этого файла символ решётки используется для обозначения комментариев, которые оболочка не обрабатывает. Однако, первая строка — это особый случай, здесь решётка, за которой следует восклицательный знак (эту последовательность называют шебанг
) и путь к bash, указывают системе на то, что сценарий создан именно для bash. Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит
#!/bin/bash
# This is a comment pwd

6 whoami Тут, также, как ив командной строке, можно записывать команды водной строке, разделяя точкой с запятой. Однако, если писать команды на разных строках, файл легче читать. В любом случае оболочка их обработает. Установка разрешений для файла сценария Сохраните файл, дав ему имя myscript, и работа по созданию скрипта почти закончена. Сейчас осталось лишь сделать этот файл исполняемым, иначе, попытавшись его запустить, вы столкнётесь с ошибкой Permission denied. Попытка запуска файла сценария с неправильно настроенными разрешениями Сделаем файл исполняемым chmod +x ./myscript Теперь попытаемся его выполнить
./myscript После настройки разрешений всё работает как надо. Успешный запуск скрипта Вывод сообщений Для вывода текста в консоль Linux применяется команда echo. Воспользуемся знанием этого факта и отредактируем наш скрипт, добавив пояснения к данным, которые выводят уже имеющиеся в нём команды
#!/bin/bash
# our comment is here echo "The current directory is:" pwd echo "The user logged in is:" whoami Вот что получится после запуска обновлённого скрипта.

7 Вывод сообщений из скрипта Теперь мы можем выводить поясняющие надписи, используя команду echo. Если вы не знаете, как отредактировать файл, пользуясь средствами Linux, или раньше не встречались с командой echo, взгляните на этот материал. Использование переменных Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами. Нет ничего плохого в исполнении отдельных команд без хранения результатов их работы, но возможности такого подхода весьма ограничены. Существуют два типа переменных, которые можно использовать в скриптах
● Переменные среды
● Пользовательские переменные Переменные среды Иногда в командах оболочки нужно работать с некими системными данными. Вот, например, как вывести домашнюю директорию текущего пользователя
#!/bin/bash
# display user home echo "Home for the current user is: $HOME" Обратите внимание на то, что мы можем использовать системную переменную $HOME в двойных кавычках, это не помешает системе её распознать. Вот что получится, если выполнить вышеприведённый сценарий. Использование переменной среды в сценарии А что если надо вывести на экран значок доллара Попробуем так echo "I have $1 in my pocket"

8 Система обнаружит знак доллара в строке, ограниченной кавычками, и решит, что мы сослались на переменную. Скрипт попытается вывести на экран значение неопределённой переменной $1. Это не то, что нам нужно. Что делать В подобной ситуации поможет использование управляющего символа, обратной косой черты, перед знаком доллара echo "I have \$1 in my pocket" Теперь сценарий выведет именно то, что ожидается. Использование управляющей последовательности для вывода знака доллара Пользовательские переменные В дополнение к переменным среды, скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария. Как ив случае с системными переменными, к пользовательским переменным можно обращаться, используя знак доллара
#!/bin/bash
# testing variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade" Вот что получится после запуска такого сценария. Пользовательские переменные в сценарии Подстановка команд Одна из самых полезных возможностей скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария. Сделать это можно двумя способами.
● С помощью значка обратного апострофа «`»

9
● С помощью конструкции $() Используя первый подход, проследите затем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка mydir=`pwd` При втором подходе тоже самое записывают так mydir=$(pwd) А скрипт, в итоге, может выглядеть так
#!/bin/bash mydir=$(pwd) echo $mydir Входе его работы вывод команды pwd будет сохранён в переменной mydir, содержимое которой, с помощью команды echo, попадёт в консоль. Скрипт, сохраняющий результаты работы команды в переменной Математические операции Для выполнения математических операций в файле скрипта можно использовать конструкцию вида
$((a+b)):
#!/bin/bash var1=$(( 5 + 5 )) echo $var1 var2=$(( $var1 * 2 )) echo $var2 Математические операции в сценарии Управляющая конструкция if-then В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное

10 применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then. В наиболее простом виде она выглядит так if команда then команды fi А вот рабочий пример
#!/bin/bash if pwd then echo "It works" fi В данном случае, если выполнение команды pwd завершится успешно, в консоль будет выведен текст
«it works». Воспользуемся имеющимися у нас знаниями и напишем более сложный сценарий. Скажем, надо найти некоего пользователя в /etc/passwd, и если найти его удалось, сообщить о том, что он существует.
#!/bin/bash user=likegeeks if grep $user /etc/passwd then echo "The user $user Exists" fi Вот что получается после запуска этого скрипта. Поиск пользователя Здесь мы воспользовались командой grep для поиска пользователя в файле /etc/passwd. Если команда grep вам незнакома, её описание можно найти здесь
В этом примере, если пользователь найден, скрипт выведет соответствующее сообщение. А если найти пользователя не удалось В данном случае скрипт просто завершит выполнение, ничего нам не сообщив. Хотелось бы, чтобы он сказал нами об этом, поэтому усовершенствуем код.

11 Управляющая конструкция if-then-else Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией if-then-else. Вот как она устроена if команда then команды else команды fi Если первая команда возвратит ноль, что означаете успешное выполнение, условие окажется истинными выполнение не пойдёт по ветке else. В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else. Напишем такой скрипт
#!/bin/bash user=anotherUser if grep $user /etc/passwd then echo "The user $user Exists" else echo "The user $user doesn’t exist" fi Его исполнение пошло по ветке else. Запуск скрипта с конструкцией if-then-else Ну что же, продолжаем двигаться дальше и зададимся вопросом о более сложных условиях. Что если надо проверить не одно условие, а несколько Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, итак далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так if команда then команды

12 elif команда then команды fi Если первая команда вернёт ноль, что говорит о её успешном выполнении, выполнятся команды в первом блоке then, иначе, если первое условие окажется ложными если вторая команда вернёт ноль, выполнится второй блок кода.
#!/bin/bash user=anotherUser if grep $user /etc/passwd then echo "The user $user Exists" elif ls /home then echo "The user doesn’t exist but anyway there is a directory under /home" fi В подобном скрипте можно, например, создавать нового пользователя с помощью команды useradd, если поиск не дал результатов, или делать ещё что-нибудь полезное. Сравнение чисел В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд. n1 - eq n2 Возвращает истинное значение, если n1 равно n2. n1 - ge n2 Возвращает истинное значение, если n1 больше или равно n2. n1 - gt n2 Возвращает истинное значение, если n1 больше n2. n1 - le n2 Возвращает истинное значение, если n1 меньше или равно n2. n1 - lt n2 Возвращает истинное значение, если n1 меньше n2. n1 - ne n2 Возвращает истинное значение, если n1 неравно. В качестве примера опробуем один из операторов сравнения. Обратите внимание на то, что выражение заключено в квадратные скобки.
#!/bin/bash val1=6 if [ $val1 -gt 5 ] then echo "The test value $value1 is greater than 5" else echo "The test value $value1 is not greater than 5"

13 fi Вот что выведет эта команда. Сравнение чисел в скриптах Значение переменной val1 больше чем 5, в итоге выполняется ветвь then оператора сравнения ив консоль выводится соответствующее сообщение. Сравнение строк В сценариях можно сравнивать и строковые значения. Операторы сравнения выглядят довольно просто, однако у операций сравнения строк есть определённые особенности, которых мы коснёмся ниже. Вот список операторов. str1 = str2 Проверяет строки на равенство, возвращает истину, если строки идентичны. str1 != str2 Возвращает истину, если строки неидентичны Возвращает истину, если str1 меньше, чем str2. str1 > str2 Возвращает истину, если str1 больше, чем str2.
- n str1 Возвращает истину, если длина str1 больше нуля.
- z str1 Возвращает истину, если длина str1 равна нулю. Вот пример сравнения строк в сценарии
#!/bin/bash user ="likegeeks" if [$user = $USER] then echo "The user $user is the current logged in user" fi В результате выполнения скрипта получим следующее. Сравнение строк в скриптах Вот одна особенность сравнения строк, о которой стоит упомянуть. А именно, операторы «>» и «<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>» как команду перенаправления вывода. Вот как работа с этими операторами выглядит в коде

14
#!/bin/bash val1=text val2="another text" if [ $val1 \> $val2 ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi Вот результаты работы скрипта. Сравнение строк, выведенное предупреждение Обратите внимание на то, что скрипт, хотя и выполняется, выдаёт предупреждение
./myscript: line 5: [: too many arguments Для того, чтобы избавиться от этого предупреждения, заключим $val2 в двойные кавычки
#!/bin/bash val1=text val2="another text" if [ $val1 \> "$val2" ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi Теперь всё работает как надо. Сравнение строк

15
Ещё одна особенность операторов «>» и «<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым
Likegeeks likegeeks Сохраним его, дав имя myfile, после чего выполним в терминале такую команду sort myfile Она отсортирует строки из файла так likegeeks
Likegeeks Команда sort, по умолчанию, сортирует строки по возрастанию, то есть строчная буква в нашем примере меньше прописной. Теперь подготовим скрипт, который будет сравнивать те же строки
#!/bin/bash val1=Likegeeks val2=likegeeks if [ $val1 \> $val2 ] then echo "$val1 is greater than $val2" else echo "$val1 is less than $val2" fi Если его запустить, окажется, что всё наоборот — строчная буква теперь больше прописной. Команда sort и сравнение строк в файле сценария В командах сравнения прописные буквы меньше строчных. Сравнение строк здесь выполняется путём сравнения кодов символов, порядок сортировки, таким образом, зависит от кодов символов. Команда sort, в свою очередь, использует порядок сортировки, заданный в настройках системного языка. Проверки файлов

16 Пожалуй, нижеприведённые команды используются в скриптах чаще всего. Они позволяют проверять различные условия, касающиеся файлов. Вот список этих команд.
- d file Проверяет, существует ли файл, и является ли он директорией.
- e file Проверяет, существует ли файл.
- f file Проверяет, существует ли файл, и является ли он файлом.
- r file Проверяет, существует ли файл, и доступен ли он для чтения.
- s file Проверяет, существует ли файл, и не является ли он пустым.
- w file Проверяет, существует ли файл, и доступен ли он для записи.
- x file Проверяет, существует ли файл, и является ли он исполняемым. file1 - nt file2 Проверяет, новее ли file1, чем file2. file1 - ot file2 Проверяет, старше ли file1, чем file2.
-
O file Проверяет, существует ли файл, и является ли его владельцем текущий пользователь.
-
G file Проверяет, существует ли файл, и соответствует ли его идентификатор группы идентификатору группы текущего пользователя. Эти команды, как впрочем, и многие другие рассмотренные сегодня, несложно запомнить. Их имена, являясь сокращениями от различных слов, прямо указывают на выполняемые ими проверки. Опробуем одну из команд на практике
#!/bin/bash mydir=/home/likegeeks if [ -d $mydir ] then echo "The $mydir directory exists" cd $ mydir ls else echo "The $mydir directory does not exist" fi Этот скрипт, для существующей директории, выведете содержимое. Вывод содержимого директории Полагаем, с остальными командами вы сможете поэкспериментировать самостоятельно, все они применяются потому же принципу. Итоги

17 Сегодня мы рассказали о том, как приступить к написанию скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.
1.
Bash Script Step By Step
— здесь речь идёт о том, как начать создание скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.
2.
Bash Scripting Part 2, Bash the awesome
— тут раскрываются особенности работы с циклами for и while.
3.
Bash Scripting Part 3, Parameters & options
— этот материал посвящён параметрам командной строки и ключам, которые можно передавать скриптам, работе сданными, которые вводит пользователь, и которые можно читать из файлов.
4.
Bash Scripting Part 4, Input & Output
— здесь речь идёт о дескрипторах файлов и о работе сними, о потоках ввода, вывода, ошибок, о перенаправлении вывода.
5.
Bash Scripting Part 5, Sighals & Jobs
— этот материал посвящён сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.
6.
Bash Scripting Part 6, Functions
— тут можно узнать о создании и использовании функций в скриптах, о разработке библиотек.
7.
Bash Scripting Part 7, Using sed
— эта статья посвящена работе с потоковым текстовым редактором sed.
8.
Bash Scripting Part 8, Using awk
— данный материал посвящён программированию на языке обработки данных awk.
9.
Bash Scripting Part 9, Regular Expressions
— тут можно почитать об использовании регулярных выражений в скриптах.
10.
Bash Scripting Part 10, Practical Examples
— здесь приведены приёмы работы с сообщениями, которые можно отправлять пользователям, атак же методика мониторинга диска.
11.
Bash Scripting Part 11, Expect Command
— этот материал посвящён средству Expect, с помощью которого можно автоматизировать взаимодействие с интерактивными утилитами. В частности, здесь идёт речь об скриптах и об их взаимодействии с скриптами и другими программами. Полагаем, одно из ценных свойств этой серии статей заключается в том, что она, начинаясь с самого простого, подходящего для пользователей любого уровня, постепенно ведёт к довольно серьёзным темам, давая шанс всем желающим продвинуться в деле создания сценариев командной строки Linux.

18 скрипты, часть 2: циклы В прошлый раз мы рассказали об основах программирования для bash. Даже то немногое, что уже разобрано, позволяет всем желающим приступить к автоматизации работы в Linux. В этом материале продолжим рассказ о скриптах, поговорим об управляющих конструкциях, которые позволяют выполнять повторяющиеся действия. Речь идёт о циклах for и while, о методах работы сними и о практических примерах их применения. Циклы for Оболочка bash поддерживает циклы for, которые позволяют организовывать перебор последовательностей значений. Вот какова базовая структура таких циклов for var in list do команды done В каждой итерации цикла в переменную var будет записываться следующее значение из списка list. В первом проходе цикла, таким образом, будет задействовано первое значение из списка. Во втором — второе, итак далее — до тех пор, пока цикл не дойдёт до последнего элемента. Перебор простых значений Пожалуй, самый простой пример цикла for в скриптах — это перебор списка простых значений
#!/bin/bash for var in first second third fourth fifth do echo The $var item done Ниже показаны результаты работы этого скрипта. Хорошо видно, что в переменную $var последовательно попадают элементы из списка. Происходит так до тех пор, пока цикл не дойдёт до последнего из них. Простой цикл for Обратите внимание на то, что переменная $var сохраняет значение при выходе из цикла, её содержимое можно менять, в целом, работать с ней можно как с любой другой переменной.

19 Перебор сложных значений В списке, использованном при инициализации цикла for, могут содержаться не только простые строки, состоящие из одного слова, но и целые фразы, в которые входят несколько слови знаков препинания. Например, всё это может выглядеть так
#!/bin/bash for var in first "the second" "the third" "I’ll do it" do echo "This is: $var" done Вот что получится после того, как этот цикл пройдётся по списку. Как видите, результат вполне ожидаем. Перебор сложных значений Инициализация цикла списком, полученным из результатов работы команды
Ещё один способ инициализации цикла for заключается в передаче ему списка, который является результатом работы некоей команды. Тут используется подстановка команд для их исполнения и получения результатов их работы.
#!/bin/bash file="myfile" for var in $(cat $file) do echo " $var" done В этом примере задействована команда cat, которая читает содержимое файла. Полученный список значений передаётся в цикли выводится на экран. Обратите внимание на то, что в файле, к которому мы обращаемся, содержится список слов, разделённых знаками перевода строки, пробелы при этом не используются.

20 Цикл, который перебирает содержимое файла Тут надо учесть, что подобный подход, если ожидается построчная обработка данных, не сработает для файла более сложной структуры, в строках которого может содержаться по несколько слов, разделённых пробелами. Цикл будет обрабатывать отдельные слова, а не строки. Что, если это совсем не то, что нужно Разделители полей Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется IFS (Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы
● Пробел
● Знак табуляции
● Знак перевода строки Если bash встречает в данных любой из этих символов, он считает, что передним следующее самостоятельное значение списка. Для того, чтобы решить проблему, можно временно изменить переменную среды IFS. Вот как это сделать в скрипте, если исходить из предположения, что в качестве разделителя полей нужен только перевод строки
IFS=$'\n' После добавления этой команды в скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.
#!/bin/bash file="/etc/passwd"
IFS=$'\n' for var in $(cat $file) do echo " $var" done Если этот скрипт запустить, он выведет он именно то, что от него требуется, давая, в каждой итерации цикла, доступ к очередной строке, записанной в файл.

21 Построчный обход содержимого файла в цикле for Разделителями могут быть и другие символы. Например, выше мы выводили на экран содержимое файла /etc/passwd. Данные о пользователях в строках разделены с помощью двоеточий. Если в цикле нужно обрабатывать подобные строки, IFS можно настроить так
IFS=: Обход файлов, содержащихся в директории Один из самых распространённых вариантов использования циклов for в скриптах заключается в обходе файлов, находящихся в некоей директории, ив обработке этих файлов. Например, вот как можно вывести список файлов и папок
#!/bin/bash for file in /home/likegeeks/* do if [ -d "$file" ] then echo "$file is a directory" elif [ -f "$file" ] then echo "$file is a file" fi done Если вы разобрались с предыдущим материалом из этой серии статей, вам должно быть понятно устройство конструкции if-then, атак же то, как отличить файл от папки. Если вам сложно понять вышеприведённый код, перечитайте этот материал. Вот что выведет скрипт.

22 Вывод содержимого папки Обратите внимание на то, как мы инициализируем цикла именно — на подстановочный знак «*» в конце адреса папки. Этот символ можно воспринимать как шаблон, означающий все файлы с любыми именами. он позволяет организовать автоматическую подстановку имён файлов, которые соответствуют шаблону. При проверке условия в операторе if, мы заключаем имя переменной в кавычки. Сделано это потому что имя файла или папки может содержать пробелы. Циклы for в стиле C Если вы знакомы с языком программирования C, синтаксис описания циклов for может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов for (i = 0; i < 10; i++)
{ printf(“number is %d\n”, i);
} В скриптах можно использовать циклы for, описание которых выглядит очень похожим на циклы в стиле C, правда, без некоторых отличий тут не обошлось. Схема цикла при подобном подходе выглядит так for (( начальное значение переменной ; условие окончания цикла изменение переменной )) На bash это можно написать так for (( a = 1; a < 10; a++ )) А вот рабочий пример
#!/bin/bash for (( i=1; i <= 10; i++ )) do

23 echo "number is $i" done Этот код выведет список чисел от 1 до 10. Работа цикла в стиле C Цикл while Конструкция for — не единственный способ организации циклов в скриптах. Здесь можно пользоваться и циклами while. В таком цикле можно задать команду проверки некоего условия и выполнять тело цикла до тех пор, пока проверяемое условие возвращает ноль, или сигнал успешного завершения некоей операции. Когда условие цикла вернёт ненулевое значение, что означает ошибку, цикл остановится. Вот схема организации циклов while while команда проверки условия do другие команды done Взглянем например скрипта с таким циклом
#!/bin/bash var1=5 while [ $var1 -gt 0 ] do echo $var1 var1=$[ $var1 - 1 ] done На входе в цикл проверяется, больше ли нуля переменная $var1. Если это так, выполняется тело цикла, в котором из значения переменной вычитается единица. Так происходит в каждой итерации, при этом мы выводим в консоль значение переменной до его модификации. Как только $var1 примет значение 0, цикл прекращается.

24 Результат работы цикла while Если не модифицировать переменную $var1, это приведёт к попаданию скрипта в бесконечный цикл. Вложенные циклы В теле цикла можно использовать любые команды, в том числе — запускать другие циклы. Такие конструкции называют вложенными циклами
#!/bin/bash for (( a = 1; a <= 3; a++ )) do echo "Start $a:" for (( b = 1; b <= 3; b++ )) do echo " Inner loop: $b" done done Ниже показано то, что выведет этот скрипт. Как видно, сначала выполняется первая итерация внешнего цикла, потом — три итерации внутреннего, после его завершения снова вдело вступает внешний цикл, потом опять — внутренний. Вложенные циклы Обработка содержимого файла

25 Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd:
#!/bin/bash
IFS=$'\n' for entry in $(cat /etc/passwd) do echo "Values in $entry –"
IFS=: for value in $entry do echo " $value" done done В этом скрипте два цикла. Первый проходится по строкам, используя в качестве разделителя знак перевода строки. Внутренний занят разбором строк, поля которых разделены двоеточиями. Обработка данных файла Такой подход можно использовать при обработке файлов формата CSV, или любых подобных файлов, записывая, по мере надобности, в переменную окружения IFS символ-разделитель. Управление циклами Возможно, после входа в цикл, нужно будет остановить его при достижении переменной цикла определённого значения, которое не соответствует изначально заданному условию окончания цикла.

26 Надо ли будет в такой ситуации дожидаться нормального завершения цикла Нет конечно, ив подобных случаях пригодятся следующие две команды
● break
● continue Команда break Эта команда позволяет прервать выполнение цикла. Её можно использовать и для циклов for, и для циклов while:
#!/bin/bash for var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo "Number: $var1" done Такой цикл, в обычных условиях, пройдётся по всему списку значений из списка. Однако, в нашем случае, его выполнение будет прервано, когда переменная $var1 будет равна 5. Досрочный выход из цикла for Вот — тоже самое, но уже для цикла while:
#!/bin/bash var1=1 while [ $var1 -lt 10 ] do if [ $var1 -eq 5 ] then break fi

27 echo "Iteration: $var1" var1=$(( $var1 + 1 )) done Команда break, исполненная, когда значение $var1 станет равно 5, прерывает цикл. В консоль выведется тоже самое, что ив предыдущем примере. Команда continue Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду continue в цикле for:
#!/bin/bash for (( var1 = 1; var1 < 15; var1++ )) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "Iteration number: $var1" done Когда условие внутри цикла выполняется, то есть, когда $var1 больше 5 и меньше 10, оболочка исполняет команду continue. Это приводит к пропуску оставшихся в теле цикла команд и переходу к следующей итерации. Команда continue в цикле for Обработка вывода, выполняемого в цикле Данные, выводимые в цикле, можно обработать, либо перенаправив вывод, либо передав их в конвейер. Делается это с помощью добавления команд обработки вывода после инструкции done. Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:
#!/bin/bash

28 for (( a = 1; a < 10; a++ )) do echo "Number is $a" done > myfile.txt echo "finished." Оболочка создаст файл myfile.txt и перенаправит в этот файл вывод конструкции for. Откроем файл и удостоверимся в том, что он содержит именно то, что ожидается.
Перенаправление вывода цикла в файл Пример поиск исполняемых файлов Давайте воспользуемся тем, что мы уже разобрали, и напишем что-нибудь полезное. Например, если надо выяснить, какие именно исполняемые файлы доступны в системе, можно просканировать все папки, записанные в переменную окружения PATH. Весь арсенал средств, который для этого нужен, у нас уже есть, надо лишь собрать всё это воедино
#!/bin/bash
IFS=: for folder in $PATH do echo "$folder:" for file in $folder/* do if [ -x $file ] then echo " $file" fi done done Такой вот скрипт, небольшой и несложный, позволил получить список исполняемых файлов, хранящихся в папках из PATH.

29 Поиск исполняемых файлов в папках из переменной PATH Итоги Сегодня мы поговорили о циклах for ив скриптах, о том, каких запускать, какими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий. Если предположить, что вы — разработчик скриптов, который знает о них только то, что изложено впервой части этого цикла статей, ив этой, второй, то вы уже вполне можете написать кое-что полезное. Впереди — третья часть, разобравшись с которой, вы узнаете, как передавать скриптам параметры и ключи командной строки, и что с этим всем делать.

30 скрипты, часть 3: параметры и ключи командной строки Освоив предыдущие части этой серии материалов, вы узнали о том, что такое скрипты, каких писать, как управлять потоком выполнения программы, как работать с файлами. Сегодня мы поговорим о том, как добавить скриптам интерактивности, оснастив их возможностями по получению данных от пользователя и по обработке этих данных. Наиболее распространённый способ передачи данных сценариям заключается в использовании параметров командной строки. Вызвав сценарий с параметрами, мы передаём ему некую информацию, с которой он может работать. Выглядит это так
$ ./myscript 10 20 В данном примере сценарию передано два параметра — «10» и «20». Всё это хорошо, но как прочесть данные в скрипте Чтение параметров командной строки Оболочка bash назначает специальным переменным, называемым позиционными параметрами, введённые при вызове скрипта параметры командной строки
● $0 — имя скрипта.
● $1 — первый параметр.
● $2 — второй параметр — итак далее, вплоть до переменной $9, в которую попадает девятый параметр. Вот как можно использовать параметры командной строки в скрипте с помощью этих переменных
#!/bin/bash echo $0 echo $1 echo $2 echo $3 Запустим сценарий с параметрами
./myscript 5 10 15 Вот что он выведет в консоль. Вывод параметров, с которыми запущен скрипт


31 Обратите внимание на то, что параметры командной строки разделяются пробелами. Взглянем на ещё один пример использования параметров. Тут мы найдём сумму чисел, переданных сценарию
#!/bin/bash total=$[ $1 + $2 ] echo The first parameter is $1. echo The second parameter is $2. echo The sum is $total. Запустим скрипт и проверим результат вычислений. Сценарий, который находит сумму переданных ему чисел Параметры командной строки необязательно должны быть числами. Сценариям можно передавать и строки. Например, вот скрипт, работающий со строкой
#!/bin/bash echo Hello $1, how do you do Запустим его
./myscript Adam Он выведет то, что мы от него ожидаем. Сценарий, работающий со строковым параметром Что если параметр содержит пробелы, а нам надо обрабатывать его как самостоятельный фрагмент данных Полагаем, если вы освоили предыдущие части этого руководства, ответ вы уже знаете. Заключается он в использовании кавычек. Если скрипту надо больше девяти параметров, при обращении к ним номер в имени переменной надо заключать в фигурные скобки, например так
${10} Проверка параметров Если скрипт вызван без параметров, но для нормальной работы кода предполагается их наличие, возникнет ошибка. Поэтому рекомендуется всегда проверять наличие параметров, переданных сценарию при вызове. Например, это можно организовать так

32
#!/bin/bash if [ -n "$1" ] then echo Hello $1. else echo "No parameters found. " fi Вызовем скрипт сначала с параметром, а потом без параметров. Вызов скрипта, проверяющего наличие параметров командной строки
  1   2   3   4   5   6


написать администратору сайта