В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.
Оболочка Bash: введение
Оболочка, или шелл (shell) - это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal , eterm , nxterm и т. п.
# Мультимедиа и кодеки
Эта страница в основном содержит информацию о фонде. Потратьте время, чтобы прочитать и понять материал в этом разделе, сделает другой разделы легче перевариваются так упорно и будет хорошо стоит вашего времени. Сценарий рассказывает актерам, что они должны сказать и делать. Скрипт для компьютера сообщает компьютеру, что он должен делать или сказать.
Эти команды представляют собой смесь команд, которые мы обычно вводим в командной строке и командами, которые мы могли бы вводить в командной строке, но, как правило, не были бы важны. Важно помнить, что это. Все, что вы можете запускать нормально в командной строке, можно поместить в скрипт, и он будет делать то же самое. Точно так же все, что вы можете поместить в скрипт, также можно запустить в командной строке, и оно будет делать то же самое.
Навигация
В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.
pwd
Команда pwd , сокращение от print working directory , отображает текущее местоположение в структуре каталогов.
Вам не нужно ничего менять. Просто введите команды, как обычно, и они будут вести себя так, как обычно. Просто, вместо того, чтобы вводить их в командной строке, мы теперь вводим их в текстовый файл. Это всего лишь немного знания фона. Это не нужно понимать, чтобы писать сценарии, но полезно знать, как только вы начнете получать более сложные скрипты.
Когда мы говорим, что мы запускаем программу, мы на самом деле не запускаем программу, а ее копию, которая называется процессом. Мы делаем копию этих инструкций и ресурсов с жесткого диска в рабочую память. По сути, процесс - это исполняемый экземпляр программы.
cd
Команда cd позволяет перейти в новый каталог.
mkdir
Команда mkdir создаёт новый каталог в текущем каталоге.
Основные команды
man
Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat:
$ man cat
cat
Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.
Одновременно может быть несколько процессов, представляющих одну и ту же программу, выполняемую в памяти. Если мы начнем запускать скрипт, он фактически не запускается в этом процессе, а вместо этого запускает новый процесс для запуска внутри. Мы продемонстрируем это в следующем разделе о переменных, и его последствия должны стать яснее.
По большей части вы Не нужно слишком беспокоиться об этом явлении. Другим термином, с которым вы можете столкнуться, является выполнение сценария. Прежде чем мы сможем выполнить скрипт, он должен иметь набор разрешений на выполнение. Если вы забудете предоставить это разрешение перед запуском скрипта, вы просто получите сообщение об ошибке, сообщающее вам как таковое, и никакого вреда не будет. Сокращение 755 часто используется для скриптов, так как позволяет владельцу писать или изменять сценарий и для каждого, чтобы выполнить скрипт.
echo
Команда echo выводит свои аргументы по стандартному каналу вывода.
$ echo Hello World Hello World
Если вызвать echo без аргументов, будет выведена пустая строка.
head
Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:
$ head -50 test.txt
tail
Команда tail работает аналогично команде head , но читает строки с конца:
# Установка программ
Строка 4 - это эхо-команда, которая выводит сообщение на экран. в командной строке, и он будет вести себя точно так же. Подсветка синтаксиса заключается только в том, чтобы упростить ее чтение и не нужно делать в ваших собственных файлах.
- Что-то после # не выполняется.
- Это только для нашей справки.
Он будет просматривать эти каталоги в порядке и выполнять первый экземпляр программы или скрипта, который он находит. Это делается по нескольким причинам. Вы не хотели бы случайно запустить этот скрипт.
- Это позволяет нам иметь несколько различных версий установленной программы.
- Это повышает безопасность.
$ tail -50 test.txt
Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f:
$ tail -f test.txt
less
Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.
$ less test.txt $ ps aux | less
Подробнее о назначении символа | будет рассказано ниже в разделе команды history .
Это первая строка сценария выше. После этого это путь к интерпретатору, который должен использоваться для запуска остальных строк в текстовом файле. Шейнг должен находиться в самой первой строке файла. Также не должно быть пробелов перед символом # или между ними! и путь к интерпретатору.
Хотя вы могли бы использовать относительный путь для интерпретатора, большую часть времени вы захотите использовать абсолютный путь. Вероятно, вы запускаете скрипт из разных мест, поэтому абсолютный является самым безопасным. Хотя это и безопасно, это также требует ненужного ввода при каждом запуске скрипта.
Обычные сочетания клавиш | Описание |
---|---|
G | Перемещает в конец файла |
g | Перемещает в начало файла |
:50 | Перемещает на 50 строку файла |
q | Выход из less |
/searchterm | Поиск строки, совпадающей с ‘searchterm’, ниже текущей строки |
/ | |
?searchterm | Поиск строки, совпадающей с ‘searchterm’, выше текущей строки |
? | Перемещает на следующий подходящий результат поиска |
up | Перемещает на одну строку выше |
down | Перемещает на одну строку ниже |
pageup | Перемещает на одну страницу выше |
pagedown | Перемещает на одну страницу ниже |
true
Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.
false
Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.
$?
$? - это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 - ложью (false):
Это самый надежный и удобный подход. Обычно это подразумевает пробелы, и наличие или отсутствие пробела может быть разницей между командой, работающей или нет. Также привыкните к тому, чтобы помнить о наличии или отсутствии пробелов при просмотре кода. Многие решения, касающиеся его поведения, были сделаны с учетом только потребностей пользователя, а затем в этих решениях пришлось работать над сценариями. Они очень смущены, когда узнают об этом преступника. Отступом кода является еще одна область форматирования, которая важна.
Оболочка Bash: введение
Мы рассмотрим отступ кода в разделе 5, когда это станет актуальным. Отступы не требуются, но это делает ваш код более легким для чтения и затрудняет выполнение простых ошибок. Позвольте мне попытаться объяснить это немного больше. Однако, если вы являетесь «человеком, не способным к компьютеру», который не имеет для вас никакого значения.
$ true $ echo $? 0 $ false $ echo $? 1
grep
Команда grep занимается поиском переданной строки в указанном файле:
$ cat users.txt user:student password:123 user:teacher password:321 $ grep "student` file1.txt user:student password:123
grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.
history
Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++ :
Вы также можете просто скопировать и вставить, если необходимо. Создание папок Удаление файлов Открытие приложений с правами администратора Резервное копирование файлов Резервное копирование папок Проверка производительности системы Проверка устройств Проверка беспроводного соединения. Наряду со многими другими, приведенный выше список будет командами, которые мы обсудим.
Удаление папок и их подпапок
Команда, которую вы собираетесь читать, может потенциально уничтожить вашу систему! Эта команда отлично подходит для удаления каталога и всех его поддиректоров. Если вы не хотите попрощаться с вашей системой. Это приведет к удалению всего из корневой папки вниз, что, если вы сделали стандартную установку, будет всем.
$ history | grep g++ 155 g++ file1.txt 159 g++ file2.txt
Здесь также используется символ | - это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой - таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history , но увидим вывод команды grep .
При работе в командной строке вы обычно хотите работать с разрешениями по умолчанию. Таким образом, вы гарантируете, что вы случайно не сломаете что-либо, принадлежащее системе или другим пользователям, пока система и другие пользователи не изменят свои права доступа к файлам. Тем не менее, будут случаи, когда вы хотите скопировать файл в системную папку, чтобы сделать его доступным для всех пользователей системы. Поэтому попытка копирования файла в эту папку запрещена по умолчанию.
Серьезный урон может быть внесен в вашу систему путем редактирования этих файлов. Рекомендуется создать резервную копию любого файла, который вы редактируете. Для этого введите следующее. Для этого вы должны ввести. Но как мы копируем целые каталоги? Основной синтаксис следующий. Чтобы узнать статус сетевого подключения, используйте команду.
Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls , history , ps (описана ниже), перенаправляя их вывод в grep , sed или less , например.
export
Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student:
Первая строка скрипта определяет, какой интерпретатор использовать. Мы делаем это с помощью команды в терминале следующим образом. Это даст файлу соответствующие разрешения, чтобы он мог быть выполнен. Теперь откройте терминал и запустите скрипт следующим образом.
Вы увидите каталог, в котором вы сейчас работаете. Переменные в основном хранят информацию. Вы устанавливаете такие переменные с помощью текстового редактора. Поэтому давайте создадим скрипт, чтобы спросить у пользователя некоторую информацию, а затем повторить эту информацию.
$ export name=student
ps
Команда ps выводит информацию о запущенных процессах.
$ ps PID TTY TIME CMD 35346 pts/2 00:00:00 bash
Выводится четыре элемента:
- ID процесса (PID),
- тип терминала (TTY),
- время работы процесса (TIME),
- имя команды, запустившей процесс (CMD).
awk
Команда awk находит и заменяет текст в файлах по заданному шаблону: awk "pattern {action}" test.txt
Затем мы обращаемся к этому с эхом и устанавливаем опрятное предложение. Однако при запуске все еще немного беспорядочно. Чтобы объяснить это утверждение. Если утверждения являются понятным понятием, так как они похожи на «если», используемые в разговорной речи. Но скажите, что вы хотели иметь 4 или 5 чеков, ответ может заключаться в написании 4 или 5 заявлений, но это не самый практичный способ.
Это избавляет нас от повторяющихся сценариев. Есть лучшие способы проверить, что такое плод, но мы не стали этим заниматься. Этот код должен выводить текущих пользователей, их соответствующие идентификаторы и дату входа. Обратите внимание, что это переводит строки новой строки. Обязательно выполните синтаксический анализ в строке, а затем передайте его переменной.
wget
Команда wget скачивает файлы из Сети и помещает их в текущий каталог.
$ wget https://github.com/mikeizbicki/ucr-cs100
nc
ping
Команда ping тестирует сетевое подключение.
$ ping google.com PING google.com (74.125.224.34) 56(84) bytes of data. 64 bytes from lax17s01-in-f2.1e100.net (74.125.224.34): icmp_req=1 ttl=57 time=7.82 ms --- google.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 8ms rtt min/avg/max/mdev = 7.794/8.422/10.792/0.699 ms
Установка разрешений для файла сценария
Давайте перейдем к более сложным манипуляциям с данными при подстановке команд. Функции уменьшают объем редактирования, который вы должны выполнить в скрипте, если и когда вам нужно обновить свой скрипт. Ниже приведено приложение, использующее функции.
Этот пример, как вы можете видеть, может быть более длинным, но вы можете себе представить, как, добавив функции, это устранит код и уменьшит сложность. Кроме того, вы можете увидеть, хотите ли вы изменить эхо-вызов, вам нужно отредактировать одну строку, а не две.
Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.
git
Переменные окружения
Переменные окружения - это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.
Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.
Это приведет к записи каждой команды в стандартную ошибку до ее выполнения. В этом случае он принимает регулярные выражения. Давайте сделаем обычно сложную задачу, превращая строку во все прописные. Результат должен выглядеть примерно так. Вывод должен выглядеть примерно так.
Это не должно быть полным или всеобъемлющим. Команду гораздо больше, чем команда печати, в том числе операторы и т.д. И стоит заглянуть, если вас интересует то, что вы видите здесь! Это пример вывода. Синтаксис этих условий может показаться немного сложным для изучения и использования. Предполагается небольшое количество общих знаний о оболочке. Вероятно, вы видели, как выглядят следующие утверждения. Условие в этом примере по существу является командой. Это может показаться странным, но сопоставление с квадратными скобками аналогично использованию встроенной тестовой команды, например.
Переменная HOME содержит путь к домашнему каталогу текущего пользователя.
Коннекторы
Коннекторы позволяют запускать несколько команд одновременно.
$ true && echo Hello Hello $ false || echo Hello Hello $ echo Hello ; ls Hello test.txt file1.txt file2.txtКонвейеры
Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.
Как устроены bash-скрипты
И вот что, если по существу, проверяя статус выхода команды. Существуют также встроенные проверки, более специфичные для оболочек. Обычный файл означает, что он не является блочным или символьным устройством или каталогом. Таким образом, вы можете убедиться, что полезный файл существует, прежде чем что-то делать с ним.
Вы даже можете проверить, читается ли файл! Вы можете прочитать о разных типах. в учебнике. Если это так, мы читаем его в переменную. Если нет, мы проверяем, действительно ли он существует. Если это правда, мы сообщаем, что он существует, но не читаем.
$ ls -l | head
Перенаправление ввода/вывода
Перенаправление вывода
Для стандартного перенаправления вывода используются символы > и >> .
Например, этот код передаст вывод ls в файл, а не на экран:
$ ls > files.txt $ cat files.txt file1.cpp sample.txt
Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> - она дописывает данные в конец файла.
Если файл не существует, мы также сообщаем об этом. Когда вы начинаете писать и используете свои собственные условия, есть некоторые правила, которые вы должны знать, чтобы предотвратить получение ошибок, которые трудно отслеживать. Здесь следуют три важных.
Поместите «;» между предыдущим оператором и ключевым словом или поместите ключевое слово в начале новой строки. В этом уроке вы увидите один из них. . Кроме того, есть две вещи, которые могут быть полезны для понимания. Вы можете больше узнать об этих сочетаниях выражений в соответствующих синтаксисах условий.
- Вы можете инвертировать условие, поставив перед ним «!».
- Вы можете комбинировать условия, используя определенные операторы.
Перенаправление ввода
Для стандартного перенаправления вывода используется символ < . В следующем примере sort берет входные данные из файла, а не с клавиатуры:
$ cat files.txt c b $ sort < files.txt b c
Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:
$ sort < files.txt > files_sorted.txt
Продвинутое перенаправление
Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr .
$ g++ test.cpp $ ./a.out >& test.txt $ cat test.txt stdout stderr
Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к > .
Имя | Дескриптор | Описание |
---|---|---|
stdin | 0 | Стандартный поток ввода |
stdout | 1 | Стандартный поток вывода |
stderr | 2 | Стандартный поток вывода ошибок |
Например, для перенаправления stderr в test.txt нужно сделать следующее:
$ g++ test.cpp $ ./a.out 2> test.txt stdout $ cat test.txt stderr
Права доступа
Команда ls -l выводит много информации о права доступа к каждому файлу:
chmod
Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:
Вы можете вызвать chmod с описанием действий над конкретным файлом. Символ - обозначает удаление прав, символ + - добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:
$ chmod ug+rw test.txt $ ls -l test.txt -rw-rw---- 1 user group 1097374 January 26 2:48 test.txt
Кроме того, chmod можно использовать с восьмеричными числами, где 1 - это наличие прав, а 0 - отсутствие:
Rwx = 111 = 7 rw- = 110 = 6 r-x = 101 = 5 r-- = 100 = 4 ,
Пишем скрипты в Linux (обучение на примерах)
———————————————————————————-
1. Введение
Что нужно, чтобы писать скрипты
Владение инструментами командной строки и их необходимыми опциями.
Базовые знания английского языка уровня начальной школы не помешают.
Зачем нужны скрипты
Во-первых, администрирование linux-сервера в той или иной степени сводится к систематическому выполнению одних и тех же команд. Причем не обязательно, чтобы эти команды выполнял человек. Их можно запрограммировать на выполнение машиной.
Во-вторых, даже просто выполнение обычной задачи, которая (вдруг) составляет 20-1000… однообразных операций ГОРАЗДО проще реализовать в скрипте.
Что такое скрипт
Скрипт — набор инструкций, которые должен в определенном порядке и в определенное время выполнить компьютер. Инструкциями могут быть как внутренние команды оболочки (циклы, условия, обработка текстовой информации, работа с переменными окружения и прочее), так и любая программа, выполняемая нами в консоли с необходимыми параметрами.
Как писать скрипт
В нашем случае скрипт будет представлять из себя текстовый файл с атрибутами выполнения. Если файл сценария начинается с последовательности #!, которая в мире UNIX называется sha-bang, то это указывает системе какой интерпретатор следует использовать для исполнения сценария. Если это трудно понять, то просто запомните, что все скрипты мы будем начинать писать именно со строчки #!/bin/bash или #!/bin/sh, а далее пойдут команды и комментарии к ним.
Напутствие
Я Вам искренне советую писать как можно больше комментариев чуть ли ни к каждой строчке в скрипте. Пройдет время и Вам понадобится изменить или модернизировать написанный когда-то скрипт. Если не помнишь или не понимаешь, что написано в скрипте, то становится сложно его изменять, проще писать с нуля.
Какие скрипты могут нам понадобиться:
- устанавливающий правила файервола при загрузке системы.
- выполняющий backup настроек и данных.
- добавляющий почтовые ящики в почтовый сервер (точнее в базу mysql)
- запускающий в определенное время (лучше каждую ночь) программу, которая сканирует логи прокси-сервера и выдает удобный web-отчет по количеству скачанного трафика.
- отправляющий нам на почту информацию о том, что кто-то получил доступ к нашему серверу по ssh, время подключения и адрес клиента.
О методике написания скриптов
Создаем текстовый файл, редактируем его, устанавливаем права на выполнение, запускаем, смотрим ошибки, исправляем, запускаем, смотрим ошибки…
Когда все вылизано и работает правильно, ставим его в автозагрузку либо в планировщик на определенное время.
———————————————————————————-
2. Обучение написанию сценариев на внутреннем языке BASH
оригинал: https://www.linuxconfig.org/Bash_scripting_Tutorial
Это руководство предполагает отсутствие предварительных знаний о методике написания сценариев (далее скриптов) с помощью внутреннего языка Bash. С помощью данного руководства вы обнаружите в скором времени, что написание скриптов очень простая задача. Давайте начнем наше обучение с простого сценария, выполняющего вывод строки «Hello World!» (в перев. с англ. — Всем привет!)
1. Сценарий «Всем привет»
Вот ваш первый пример bash-скрипта:
#!/bin/bash
echo «Hello World»
Переходим в директорию, содержащую наш файл hello_world.sh и делаем его исполняемым:
Код: Выделить всё $ chmod +x hello_world.sh
Запускаем скрипт на выполнение
Код: Выделить всё $ ./hello_world.sh
2. Простой архивирующий bash-скрипт
Код: Выделить всё $ ./backup.sh#!/bin/bash
tar -czf myhome_directory.tar.gz /home/user
$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz
3. Работа с переменными
В данном примере мы объявляем простую переменную и выводим её на экран с помощью команды echo
Код: Выделить всё $ ./hello_world.sh#!/bin/bash
STRING=»HELLO WORLD!!!»
echo $STRING
HELLO WORLD!!!
Наш архивирующий скрипт с переменными:
Код: Выделить всё $ ./backup.sh#!/bin/bash
OF=myhome_directory_$(date +%Y%m%d).tar.gz
IF=/home/user
tar -czf $OF $IF
tar: Removing leading "\" from member names
$ du -sh *tar.gz
41M myhome_directory_20100123.tar.gz
3.1 Глобальные и локальные переменные
Код: Выделить всё $ ./variables.sh#!/bin/bash
# Объявляем глобальную переменную
# Такая переменная может использоваться в любом месте этого скрипта
VAR=»global variable»
function bash {
# Объявляем локальную переменную
# Такая переменная действительна только для функции, в которой её объявили
local VAR=»local variable»
echo $VAR
}
echo $VAR
bash
# Обратите внимание, что глобальная переменная не изменилась
echo $VAR
global variable
local variable
global variable
4. Передаем аргументы в скрипт
Код: Выделить всё $ ./arguments.sh Bash Scripting Tutorial#!/bin/bash
# Используйте предопределенные переменные для доступа к аргументам
# Выводим аргументы на экран
echo $1 $2 $3 ‘ -> echo $1 $2 $3’#Мы так же можем получить доступ к аргументам через специальный массив args=(«$@»)
# Выводим аргументы на экран
echo ${args} ${args} ${args} ‘ -> args=(«$@»); echo ${args} ${args} ${args}’# Используйте переменную $@ для вывода всех аргументов сразу
echo $@ ‘ -> echo $@’Используйте переменную $# для вывода количества переданный в скрипт аргументов
echo Number of arguments passed: $# ‘ -> echo Number of arguments passed: $#’
Bash Scripting Tutorial -> echo $1 $2 $3
Bash Scripting Tutorial -> args=("$@"); echo ${args} ${args} ${args}
Bash Scripting Tutorial -> echo $@
Number of arguments passed: 3 -> echo Number of arguments passed: $#
5. Выполнение в скрипте команд оболочки
Код: Выделить всё $ uname -o#!/bin/bash
# используйте обратные кавычки » ` ` » для выполнения команды оболочки
echo `uname -o`
# теперь попробуем без кавычек
echo uname -o
GNU/Linux
$ ./bash_backtricks.sh
GNU/Linux
uname -o
Как видим, во втором случае вывелась сама команда, а не результат её выполнения
6. Читаем пользовательский ввод (интерактивность)
Код: Выделить всё $ ./read.sh#!/bin/bash
echo -e «Hi, please type the word: \c »
read word
echo «The word you entered is: $word»
echo -e «Can you please enter two words? »
read word1 word2
echo «Here is your input: \»$word1\» \»$word2\»»
echo -e «How do you feel about bash scripting? »
# read command now stores a reply into the default build-in variable $REPLY
read
echo «You said $REPLY, I’m glad to hear that! »
echo -e «What are your favorite colours ? »
# -a makes read command to read into an array
read -a colours
echo «My favorite colours are also ${colours}, ${colours} and ${colours}:-)»
Hi, please type the word: something
The word you entered is: something
Can you please enter two words?
Debian Linux
Here is your input: "Debian" "Linux"
How do you feel about bash scripting?
good
You said good, I"m glad to hear that!
What are your favorite colours ?
blue green black
My favorite colours are also blue, green and black:-)
7. Использование ловушки
Код: Выделить всё $ ./trap.sh#!/bin/bash
# объявляем ловушку
trap bashtrap INT
# очищаем экран
clear;
# функция ловушки выполняется, когда пользователь нажимает CTRL-C:
# На экран будет выводиться => Executing bash trap subrutine !
# но скрипт будет продолжать выполняться
bashtrap()
{
echo «CTRL+C Detected !…executing bash trap !»
}
# скрипт будет считать до 10
for a in `seq 1 10`; do
echo «$a/10 to Exit.»
sleep 1;
done
echo «Exit Bash Trap Example!!!»
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
CTRL+C Detected !...executing bash trap !
10/10
Exit Bash Trap Example!!!
Как видим, сочетание клавишь Ctrl-C не остановило выполнение скрипта.
8. Массивы
8.1 Объявляем простой массив
Код: Выделить всё $./arrays.sh#!/bin/bash
# Объявляем простой массив с 4 элементами
ARRAY=(‘Debian Linux’ ‘Redhat Linux’ Ubuntu Linux)
# Получаем количество элементов в массиве
ELEMENTS=${#ARRAY[@]}# выводим в цикле каждый элемент массива
for ((i=0;i<$ELEMENTS;i++)); do
echo ${ARRAY[${i}]}
done
Debian Linux
Redhat Linux
Ubuntu
Linux
8.2 Заполняем массив значениями из файла
Код: Выделить всё $ cat bash.txt#!/bin/bash
# Объявляем массив
declare -a ARRAY
# Команда exec# stdin (обычно это клавиатура), будет производиться из этого файла. Это дает возможность читать
# содержимое файла, строку за строкой, и анализировать каждую введенную строку с помощью sed и/или awk.
exec 10let count=0 while read LINE <&10; do
ARRAY[$count]=$LINE
((count++))
doneecho Number of elements: ${#ARRAY[@]}
# Вывод значений массива
echo ${ARRAY[@]}
# закрываем файл
exec 10>&-
Debian Linux
Redhat Linux
Ubuntu
Linux
$ ./arrays.sh
Number of elements: 4
Debian Linux Redhat Linux Ubuntu Linux
9. Условия «если-то-иначе»
9.1. Простое использование «если-иначе» условий
Обратите внимание на пробелы в квадратных скобках, без которых условие работать не будет.
Код: Выделить всё $ ./if_else.sh#!/bin/bash
directory=»./BashScripting»# проверяем наличие директории
if [ -d $directory ]; then
echo «Directory exists»
else
echo «Directory does not exists»
fi
Directory does not exists
$ mkdir BashScripting
$ ./if_else.sh
Directory exists
9.2 Вложенные «если-иначе» условия
Код: Выделить всё $ ./nested.sh#!/bin/bash
# Объявляем переменную со значением 4
choice=4
# Выводим на экран
echo «1. Bash»
echo «2. Scripting»
echo «3. Tutorial»
# Выполняем, пока переменная равна четырем
# Зацикливание
while [ $choice -eq 4 ]; do# читаем пользовательский ввод
read choice
# вложенное «если-иначе» условие
if [ $choice -eq 1 ] ; thenecho «You have chosen word: Bash»
if [ $choice -eq 2 ] ; then
echo «You have chosen word: Scripting»
elseif [ $choice -eq 3 ] ; then
echo «You have chosen word: Tutorial»
else
echo «Please make a choice between 1-3 !»
echo «1. Bash»
echo «2. Scripting»
echo «3. Tutorial»
echo -n «Please choose a word ? »
choice=4
fi
fi
fi
done
1. Bash
2. Scripting
3. Tutorial
5
1. Bash
2. Scripting
3. Tutorial
Please choose a word ?
4
Please make a choice between 1-3 !
1. Bash
2. Scripting
3. Tutorial
Please choose a word ?
3
You have chosen word: Tutorial
Таким образом сначала тело цикла «while» выполняется, т.к. переменная choice изначально равна четырем. Потом читаем в неё пользовательский ввод, и если ввод не равен 1,2 или 3 то делаем нашу переменную снова равную 4, в связи с чем тело цикла повторяется (снова необходимо вводить 1,2 или 3).
10. Сравнения
10.1 Арифметические сравнения
Lt <
-gt >
-le <=
-ge >=
-eq ==
-ne !=
Код: Выделить всё $ ./equals.sh#!/bin/bash
NUM1=2
NUM2=2
if [ $NUM1 -eq $NUM2 ]; then
echo «Both Values are equal»
else
echo «Values are NOT equal»
fi
Both Values are equal
Код: Выделить всё $ ./equals.sh#!/bin/bash
# Объявляем переменные с целочисленными значениями
NUM1=2
NUM2=3
if [ $NUM1 -eq $NUM2 ]; then
echo «Both Values are equal»
else
echo «Values are NOT equal»
fi
Values are NOT equal
Код: Выделить всё $ ./equals.sh#!/bin/bash
# Объявляем переменные с целочисленными значениями
NUM1=2
NUM2=1
if [ $NUM1 -eq $NUM2 ]; then
echo «Both Values are equal»
elif [ $NUM1 -gt $NUM2 ]; then
echo «$NUM1 is greater then $NUM2»
else
echo «$NUM2 is greater then $NUM1»
fi
2 is greater then 1
10.2 Символьно-текстовые сравнения
Одинаковые
!= не одинаковые
< меньще чем
> больше чем
-n s1 переменная s1 не пустая
-z s1 переменная s1 пустая
Код: Выделить всё $ ./statement.sh#!/bin/bash
S1=»Bash»
S2=»Scripting»
if [ $S1 = $S2 ]; then
else
echo «Strings are NOT equal»
fi
Strings are NOT equal
Код: Выделить всё $ ./statement.sh#!/bin/bash
# Объявляем символьную переменную S1
S1=»Bash»
# Объявляем символьную переменную S2
S2=»Bash»
if [ $S1 = $S2 ]; then
echo «Both Strings are equal»
else
echo «Strings are NOT equal»
fi
Both Strings are equal
11. Проверка файлов
B filename Block special file
-c filename Special character file
-d directoryname Check for directory existence
-e filename Check for file existence
-f filename Check for regular file existence not a directory
-G filename Check if file exists and is owned by effective group ID.
-g filename true if file exists and is set-group-id.
-k filename Sticky bit
-L filename Symbolic link
-O filename True if file exists and is owned by the effective user id.
-r filename Check if file is a readable
-S filename Check if file is socket
-s filename Check if file is nonzero size
-u filename Check if file set-ser-id bit is set
-w filename Check if file is writable
-x filename Check if file is executable
Код: Выделить всё $ ls#!/bin/bash
file=»./file»
if [ -e $file ]; then
echo «File exists»
else
echo «File does not exists»
fi
file.sh
$ ./file.sh
File does not exists
$ touch file
$ ls
file file.sh
$ ./file.sh
File exists
Аналогично для примера мы можем использовать «в то время как» петли, чтобы проверить, если файл не существует. Этот сценарий будет спать, пока файл не существует. Обратите внимание на Bash отрицатель «!» что сводит на нет (инвертирует) -e опцию.
12. Циклы
12.1. Цикл For
#!/bin/bash
# for цикл
for f in $(ls /var/); do
echo $f
done
Запуск for-цикла из командной строки bash:
Код: Выделить всё $ for f in $(ls /var/); do echo $f; done Код: Выделить всё $ for f in $(ls /var/); do echo $f; done
backups
cache
crash
games
lib
local
lock
log
mail
opt
run
spool
tmp
www
12.2. While цикл
Код: Выделить всё $ ./while_loop.sh#!/bin/bash
COUNT=6
# while цикл
while [ $COUNT -gt 0 ]; do
let COUNT=COUNT-1
done
Value of count is: 6
Value of count is: 5
Value of count is: 4
Value of count is: 3
Value of count is: 2
Value of count is: 1
12.3. Until цикл
Код: Выделить всё $ ./until_loop.sh#!/bin/bash
COUNT=0
# until цикл
until [ $COUNT -gt 5 ]; do
echo Value of count is: $COUNT
let COUNT=COUNT+1
done
Value of count is: 0
Value of count is: 1
Value of count is: 2
Value of count is: 3
Value of count is: 4
Value of count is: 5
12.4. Циклы с неявными условиями
В следующем примере условием while-цикла является наличие стандартного ввода.
Тело цикла будет выполняться пока есть чему перенаправляться из стандартного вывода в команду read.
Код: Выделить всё $ ls -1#!/bin/bash
# Данный скрипт будет искать и удалять пробелы
# в файлах, заменяя их на подчеркивания
DIR=».»
Управление циклом с командой read путем перенаправления вывода в цикле.
find $DIR -type f | while read file; do
# используем POSIX-класс [:space:] чтобы найти пробелы в именах файлов
if [[ «$file» = *[[:space:]]* ]]; then
# замена пробелов подчеркиваниями
mv «$file» `echo $file | tr ‘ ‘ ‘_’`
fi;
done
script.sh
$ touch "file with spaces"
$ ls -1
file with spaces
script.sh
$ ./script.sh
$ ls -1
file_with_spaces
script.sh
13. Функции
Код: Выделить всё $ ./functions.sh#!/bin/bash
# Функции могут быть объявлены в любом порядке
function function_B {
echo Function B.
}
function function_A {
echo $1
}
function function_D {
echo Function D.
}
function function_C {
echo $1
}
# Вызываем функции
# передаем параметр в функцию function A
function_A «Function A.»
function_B
# передаем параметр в функцию function C
function_C «Function C.»
function_D
Function A.
Function B.
Function C.
Function D.
14. Оператор выбора — Select
Код: Выделить всё $ ./select.sh#!/bin/bash
PS3=’Choose one word: ‘
# select
select word in «linux» «bash» «scripting» «tutorial»
do
echo «The word you have selected is: $word»
# Прерываем, в противном случае цикл будет бесконечный.
break
done
exit 0
1) linux
2) bash
3) scripting
4) tutorial
Choose one word: 4
The word you have selected is: tutorial
15. Оператор выбора — Case
Код: Выделить всё $ ./case.sh#!/bin/bash
echo «What is your preferred programming / scripting language»
echo «1) bash»
echo «2) perl»
echo «3) phyton»
echo «4) c++»
echo «5) I do not know !»
read case;
# простая структура case-выбора
# обратите внимание, что в данном примере $case — всего лишь переменная
# и не обязана так называться. Это лишь пример
case $case in
1) echo «You selected bash»;;
2) echo «You selected perl»;;
3) echo «You selected phyton»;;
4) echo «You selected c++»;;
5) exit
esac
What is your preferred programming / scripting language
1) bash
2) perl
3) phyton
4) c++
5) I do not know !
4
You selected c++
———————————————————————————-
Более подробную информацию можно получить из различных источников, например отсюда
оригинал: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin … -book.html
https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296