- Titiaiev / bash-guide-1.md
- Оболочка Bash — шпаргалка для начинающих
- Оболочка Bash: введение
- Навигация
- mkdir
- Основные команды
- false
- history
- export
- Переменные окружения
- Коннекторы
- Конвейеры
- Перенаправление ввода/вывода
- Перенаправление вывода
- Перенаправление ввода
- Продвинутое перенаправление
- Права доступа
- chmod
- Сочетания клавиш
Titiaiev / bash-guide-1.md
Бесплатная книга-сайт на русском, полный гайд
Advanced Bash-Scripting Guide
BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.
break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.
И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе
Что необходимо знать с самого начала
- Любой bash-скрипт должен начинаться со строки:
в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash ) поменяйте её на ваш путь.
- Коментарии начинаются с символа # (кроме первой строки).
- В bash переменные не имеют типа(о них речь пойдет ниже)
Переменные и параметры скрипта
Приведу как пример небольшой пример, который мы разберем:
#!/bin/bash #указываем где у нас хранится bash-интерпретатор
#присваиваем переменной parametr1 значение первого параметра скрипта
parametr1=$1
#присваиваем переменной script_name значение имени скрипта
script_name=$0
# команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной.
echo «Вы запустили скрипт с именем $script_name и параметром $parametr1»
# здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных.
echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’
#Выход с кодом 0 (удачное завершение работы скрипта)
exit 0
Результат выполнения скрипта:
$ ./test.sh qwerty
Вы запустили скрипт с именем ./test.sh и параметром qwerty
Вы запустили скрипт с именем $script_name и параметром $parametr1
После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными:
$DIRSTACK — содержимое вершины стека каталогов
$EDITOR — текстовый редактор по умолчанию
$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как.
$UID — . содержит реальный идентификатор, который устанавливается только при логине.
$FUNCNAME — имя текущей функции в скрипте.
$GROUPS — массив групп к которым принадлежит текущий пользователь
$HOME — домашний каталог пользователя
$HOSTNAME — ваш hostname
$HOSTTYPE — архитектура машины.
$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов
$OLDPWD — прежний рабочий каталог
$OSTYPE — тип ОС
$PATH — путь поиска программ
$PPID — идентификатор родительского процесса
$SECONDS — время работы скрипта(в сек.)
$# — общее количество параметров переданных скрипту
$* — все аргументы переданыне скрипту(выводятся в строку)
$@ — тоже самое, что и предыдущий, но параметры выводятся в столбик
$! — PID последнего запущенного в фоне процесса
$$ — PID самого скрипта
Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере):
#!/bin/bash
#в переменную source засовываем первый параметр скрипта
source=$1
#в переменную dest засовываем второй параметр скрипта
dest=$2
# в ковычках указываем имена переменных для сравнения. -eq — логическое сравнение обозначающие «равны»
if [[ «$source» -eq «$dest» ]]
# если они действительно равны, то
then
#выводим сообщение об ошибке, т.к. $source и $dest у нас равны
echo «Применик $dest и источник $source один и тот же файл!»
# выходим с ошибкой (1 — код ошибки)
exit 1
# если же они не равны
else
# то выполняем команду cp: копируем источник в приемник
cp $source $dest
echo «Удачное копирование!»
fi #обозначаем окончание условия.
Результат выполнения скрипта:
$ ./primer2.sh 1 1
Применик 1 и источник 1 один и тот же файл!
$ ./primer2.sh 1 2
Удачное копирование!
Структура if-then-else используется следующим образом:
В качестве команд возвращающих код возврата могут выступать структуры [[ , [ , test, (( )) или любая другая(или несколько) linux-команда.
test — используется для логического сравнения. после выражения, неоьбходима закрывающая скобка «]»
[ — синоним команды test
[[ — расширенная версия «[» (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку «]]»
(( )) — математическое сравнение.
для построения многоярусных условий вида:
для краткости и читаемости кода, можно использовать структуру:
Условия. Множественный выбор
Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.
#!/bin/bash
echo «Выберите редатор для запуска:»
echo «1 Запуск программы nano»
echo «2 Запуск программы vi»
echo «3 Запуск программы emacs»
echo «4 Выход»
#здесь мы читаем в переменную $doing со стандартного ввода
read doing
case $doing in
1)
/usr/bin/nano # если $doing содержит 1, то запустить nano
;;
2)
/usr/bin/vi # если $doing содержит 2, то запустить vi
;;
3)
/usr/bin/emacs # если $doing содержит 3, то запустить emacs
;;
4)
exit 0
;;
*) #если введено с клавиатуры то, что в case не описывается, выполнять следующее:
echo «Введено неправильное действие»
esac #окончание оператора case.
$ ./menu2.sh
Выберите редатор для запуска:
1 Запуск программы nano
2 Запуск программы vi
3 Запуск программы emacs
4 Выход
После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )
Прведу список логических операторв, которые используются для конструкции if-then-else-fi:
-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( # меньше
-le,( # меньше или равно
-gt,(>) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»
С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.
Циклы. Цикл for-in.
Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной.
Синтаксис следующий:
Рассмотрим небольшой пример:
После выполнения примера в первых 5 виртуальных консолях(терминалах) появится строка с её номером. В переменную $i поочередно подставляются значения из списка и в цикле идет работа со значением этой переменной
Циклы. Цикл while.
Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0).
Синтаксис оператора следующий:
Пример работы цикла рассмотрим на следующем примере:
А теперь результат работы скрипта:
Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.
Теперь об условии истинности. После while , как и в условном операторе if-then-else можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор [ аналог команды test , которая проверяет истинность условия, которое ей передали.
Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно.
Вот пример:
Результат выполнения скрипта:
Команда let .
Команда let производит арифметические операции над числами и переменными.
Рассмотрим небольшой пример, в котором мы производим некоторые вычисления над введенными числами:
Ну вот, как видите ничего сложного, список математических операций стандартный:
+ — сложение
— — вычитание
* — умножение
/ — деление
** — возведение в степень
% — модуль(деление по модулю), остаток от деления
let позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: a = a+b эквивалентно a +=b и т.д
Работа с внешними программами при написании shell-скриптов
Для начала немного полезной теории.
В bash (как и многих других оболочках) есть встроенные файловые дескрипторы: 0 (stdin) , 1 (stdout) , 2 (stderr) .
stdout — Стандартный вывод. Сюда попадает все что выводят программы
stdin — Стандартный ввод. Это все что набирает юзер в консоли
stderr — Стандартный вывод ошибок.
Для операций с этими дескрипторами, существуют специальные символы: > (перенаправление вывода), (перенаправление ввода). Оперировать ими не сложно. Например:
Если есть необходимость дописывать в файл(при использовании » > » он заменятеся), необходимо вместо » > » использовать » >> «
после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры.
Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать:
цифра 2 перед » > » означает что нужно перенаправлять все что попадет в дескриптор 2(stderr).
Если необходимо заставить stderr писать в stdout , то это можно след. образом:
символ » & » означает указатель на дескриптор 1(stdout)
(Поумолчанию stderr пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).
Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой:
команда1 | команда 2 — означает, что вывод команды 1 передастся на ввод команде 2
Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например:
вывод команды ls -la передается команде grep , которая отбирает все строки, в которых встретится слово hash, и передает команде сортировке sort , которая пишет результат в файл sorting_list. Все довольно понятно и просто.
Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.
1. Передача вывода в переменную.
Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в « ковычки, например
Результат работы: qwerty
Однако если вы захотите записать в переменную список директорий, то необходимо, должным образом обработать результат для помещения данных в переменную. Рассмотрим небольшой, пример:
Здесь мы используем цикл for-do-done для архивирование всех директорий в папке /svn/ с помощью команды svnadmin hotcopy (что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST= find /svn/ -type d 2>/dev/null| awk ‘
Источник
Оболочка Bash — шпаргалка для начинающих
В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.
Оболочка Bash: введение
Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal, eterm, nxterm и т. п.
Навигация
В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.
Команда pwd , сокращение от print working directory, отображает текущее местоположение в структуре каталогов.
Команда cd позволяет перейти в новый каталог.
Синтаксис | Объяснение |
---|---|
cd | Перемещение в домашний каталог |
cd | Перемещение в домашний каталог |
cd .. | Перемещение на один уровень выше |
cd — | Перемещение в предыдущий каталог |
cd Directory1 | Перемещение в каталог Directory1 |
cd Directory1/Directory2 | Перемещение в каталог Directory2 по указанному пути |
mkdir
Команда mkdir создаёт новый каталог в текущем каталоге.
Основные команды
Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat :
Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.
Команда echo выводит свои аргументы по стандартному каналу вывода.
Если вызвать echo без аргументов, будет выведена пустая строка.
Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:
Команда tail работает аналогично команде head , но читает строки с конца:
Также можно просматривать добавляемые к файлу строки в режиме реального времени при помощи флага -f :
Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.
Подробнее о назначении символа | будет рассказано ниже в разделе команды history .
Обычные сочетания клавиш | Описание |
---|---|
G | Перемещает в конец файла |
g | Перемещает в начало файла |
:50 | Перемещает на 50 строку файла |
q | Выход из less |
/searchterm | Поиск строки, совпадающей с ‘searchterm’, ниже текущей строки |
/ | Перемещает на следующий подходящий результат поиска |
?searchterm | Поиск строки, совпадающей с ‘searchterm’, выше текущей строки |
? | Перемещает на следующий подходящий результат поиска |
up | Перемещает на одну строку выше |
down | Перемещает на одну строку ниже |
pageup | Перемещает на одну страницу выше |
pagedown | Перемещает на одну страницу ниже |
Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.
false
Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.
$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):
Команда grep занимается поиском переданной строки в указанном файле:
grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.
Обычные флаги | Описание |
---|---|
-i | Отключение чувствительности к регистру |
-r | Рекурсивный поиск по директориям |
-w | Поиск только целых слов |
-c | Вывод количества найденных элементов |
-n | Вывод всей строки, содержащей запрос |
-v | Вывод инвертированного совпадения |
Также можно ознакомиться с руководством по regex. У нас на сайте тоже есть руководство по «регуляркам» в Python для новичков.
Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g . Например, следующий код заменит все слова «Hello» на «Hi»:
Также вы можете ознакомиться с руководством по sed.
history
Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++ :
Здесь также используется символ | — это так называемый конвейер (pipe). Благодаря ему можно перенаправлять вывод одной команды на вход другой — таким образом в примере выше вся история, которая в обычном режиме выводится командой history прямо в вывод терминала, будет перенаправлена в grep в качестве входных данных. Мы не увидим вывода команды history , но увидим вывод команды grep .
Это может быть довольно сложно для понимания без практики, поэтому поэкспериментируйте самостоятельно, например с командами ls , history , ps (описана ниже), перенаправляя их вывод в grep , sed или less , например.
export
Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student :
Команда ps выводит информацию о запущенных процессах.
Выводится четыре элемента:
- ID процесса (PID),
- тип терминала (TTY),
- время работы процесса (TIME),
- имя команды, запустившей процесс (CMD).
Команда awk находит и заменяет текст в файлах по заданному шаблону: awk ‘pattern
Команда wget скачивает файлы из Сети и помещает их в текущий каталог.
Команда nc — это утилита для отладки сети. Также можно ознакомиться с руководством по nc.
Команда ping тестирует сетевое подключение.
Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.
Git — это популярная система контроля версий. Также можно ознакомиться с руководством по git и нашими материалами.
Переменные окружения
Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.
Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.
11–13 октября, Онлайн, Беcплатно
Переменная HOME содержит путь к домашнему каталогу текущего пользователя.
Коннекторы
Коннекторы позволяют запускать несколько команд одновременно.
Коннектор | Описание |
---|---|
&& | Первая команда исполняется всегда, вторая — только в случае успешного завершения первой |
|| | Первая команда исполняется всегда, вторая — только в случае неудачного завершения первой |
; | Команды исполняются всегда |
Конвейеры
Конвейеры, или пайпы, позволяют соединять входные и выходные каналы различных команд. В следующем примере вывод команды ls будет передан в head , и в результате будет напечатано лишь 10 первых элементов.
Перенаправление ввода/вывода
Перенаправление вывода
Для стандартного перенаправления вывода используются символы > и >> .
Например, этот код передаст вывод ls в файл, а не на экран:
Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> — она дописывает данные в конец файла.
Перенаправление ввода
Для стандартного перенаправления вывода используется символ . В следующем примере sort берет входные данные из файла, а не с клавиатуры:
Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:
Продвинутое перенаправление
Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdout в cout и строку stderr в cerr .
Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к > .
Имя | Дескриптор | Описание |
---|---|---|
stdin | 0 | Стандартный поток ввода |
stdout | 1 | Стандартный поток вывода |
stderr | 2 | Стандартный поток вывода ошибок |
Например, для перенаправления stderr в test.txt нужно сделать следующее:
Права доступа
Команда ls -l выводит много информации о правах доступа к каждому файлу:
Вывод в примере | Описание / возможные выводы |
---|---|
— | Тип файла: — файл d каталог |
rw- | Права доступа владельца файла |
rw- | Права доступа членов группы-владельца файла |
r– | Права доступа прочих пользователей |
user | Имя владельца файла |
group | Имя группы-владельца файла |
chmod
Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:
Буква | Пользователь |
---|---|
u | Владелец |
g | Член группы |
o | Прочие пользователи |
a | Все пользователи |
Вы можете вызвать chmod с описанием действий над конкретным файлом. Символ — обозначает удаление прав, символ + — добавление. Следующий пример сделает файл доступным для чтения и записи владельцу и группе:
Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:
Следующая команда сработает так же, как и предыдущая:
Сочетания клавиш
Сочетание | Описание |
---|---|
CTRL-A | Перемещение курсора в начало строки |
CTRL-E | Перемещение курсора в конец строки |
CTRL-R | Поиск по истории |
CTRL-W | Вырезать последнее слово |
CTRL-U | Вырезать всё до курсора |
CTRL-K | Вырезать всё после курсора |
CTRL-Y | Вернуть последнюю вырезанную строку |
CTRL-_ | Отмена |
CTRL-L | Очистка экрана терминала |
Хинт для программистов: если зарегистрируетесь на соревнования Huawei Cup, то бесплатно получите доступ к онлайн-школе для участников. Можно прокачаться по разным навыкам и выиграть призы в самом соревновании.
Перейти к регистрации
Источник