Язык bash с нуля

Оболочка Bash — шпаргалка для начинающих

В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.

Оболочка Bash: введение

В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.

Команда cd позволяет перейти в новый каталог.

mkdir

Команда mkdir создаёт новый каталог в текущем каталоге.

Основные команды

Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat:

Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.

Команда echo выводит свои аргументы по стандартному каналу вывода.

$ echo Hello World
Hello World

Если вызвать echo без аргументов, будет выведена пустая строка.

Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:

Команда tail работает аналогично команде head, но читает строки с конца:

Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.

$ less test.txt
$ ps aux | less

Подробнее о назначении символа | будет рассказано ниже в разделе команды history.

Команда true всегда возвращает ноль в качестве выходного статуса для индикации успеха.

false

Команда false всегда возвращает не-ноль в качестве выходного статуса для индикации неудачи.

$? — это переменная, которая содержит выходной статус последней запущенной команды. Под статусом обычно понимается код возврата программы. 0 означает успешное выполнение программы, любое значение большее 0 отражает тот факт, что в процессе выполнения возникли некоторые ошибки. Кстати, именно поэтому в bash истинной (true) считается 0, а все, что не 0 — ложью (false):

Команда grep занимается поиском переданной строки в указанном файле:

$ cat users.txt
user:student password:123
user:teacher password:321
$ grep ‘student` file1.txt
user:student password:123

grep также может принимать несколько файлов и регулярных выражений для уточнения формата текста.

Команда sed — это потоковый редактор, преобразующий входные текстовые данные. Обычно её используют для замены выражений так: s/regexp/replacement/g. Например, следующий код заменит все слова «Hello» на «Hi»:

$ cat test.txt
Hello World
$ sed ‘s/Hello/Hi/g’ test.txt
Hi World

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:

Команда ps выводит информацию о запущенных процессах.

$ ps
PID TTY TIME CMD
35346 pts/2 00:00:00 bash

Выводится четыре элемента:

Команда awk находит и заменяет текст в файлах по заданному шаблону: awk ‘pattern ‘ test.txt

Команда wget скачивает файлы из Сети и помещает их в текущий каталог.

Команда ping тестирует сетевое подключение.

Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.

Переменные окружения

Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.

Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.

Переменная HOME содержит путь к домашнему каталогу текущего пользователя.

Коннекторы

Коннекторы позволяют запускать несколько команд одновременно.

Конвейеры

Перенаправление вывода

Для стандартного перенаправления вывода используются символы > и >>.

Например, этот код передаст вывод ls в файл, а не на экран:

$ ls > files.txt
$ cat files.txt
file1.cpp sample.txt

Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> — она дописывает данные в конец файла.

Перенаправление ввода

Для стандартного перенаправления вывода используется символ

$ cat files.txt
c
b
$ sort

Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:

Продвинутое перенаправление

Добавление & к > приводит к перенаправлению как стандартного потока выхода, так и потока ошибок. Например, файл test.cpp выведет строку stdoutв cout и строку stderr в cerr.

Если вы хотите вывести конкретный файловый дескриптор, вы можете приписать его номер к >.

Например, для перенаправления stderr в test.txt нужно сделать следующее:

Права доступа

chmod

Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:

Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:

rwx = 111 = 7
rw- = 110 = 6
r-x = 101 = 5
r— = 100 = 4

Следующая команда сработает так же, как и предыдущая:

Источник

Оболочка Bash — шпаргалка для начинающих

В данной шпаргалке затрагиваются следующие темы: введение в оболочку, навигация, основные команды, переменные окружения, коннекторы, конвейеры, перенаправление ввода/вывода, права доступа и комбинации клавиш.

Оболочка Bash: введение

Оболочка, или шелл (shell) — это программа, в нашем случае названная «bash», что является сокращением от Bourne Again Shell. Оболочка принимает ваши команды и передаёт их операционной системе. Для взаимодействия с системой используются терминалы, такие как gnome-terminal, eterm, nxterm и т. п.

В Linux файлы и каталоги имеют иерархическую организацию, то есть существует некий начальный каталог, называемый корневым. В нём содержатся файлы и подкаталоги, которые в свою очереди содержат файлы и свои подкаталоги.

Команда cd позволяет перейти в новый каталог.

Синтаксис Объяснение
cd Перемещение в домашний каталог
cd

mkdir

Команда mkdir создаёт новый каталог в текущем каталоге.

Основные команды

Команда man отображает руководства по командам. Например, следующая команда выдаст всю информацию о команде cat :

Команда cat считывает файл, переданный как аргумент, и выводит его содержимое по стандартному каналу вывода. Передача нескольких файлов в виде аргумента приведёт к выводу конкатенированного содержимого всех файлов.

Команда echo выводит свои аргументы по стандартному каналу вывода.

Если вызвать echo без аргументов, будет выведена пустая строка.

Команда head читает первые 10 строк любого переданного текста и выводит их по стандартному каналу. Число выводимых строк можно изменить:

Команда less позволяет перемещаться по переданному файлу или куску текста, причём в обоих направлениях.

Обычные сочетания клавиш Описание
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.

history

Команда history выводит историю командной строки. Обычно её используют вместе с командой grep для поиска конкретной команды. Например, следующий код найдёт все команды, содержащие строку g++ :

export

Команда export устанавливает переменные окружения для передачи дочерним процессам. Например, так можно передать переменную name со значением student :

Команда ps выводит информацию о запущенных процессах.

Выводится четыре элемента:

Команда awk находит и заменяет текст в файлах по заданному шаблону: awk ‘pattern ‘ test.txt

Команда wget скачивает файлы из Сети и помещает их в текущий каталог.

Команда nc — это утилита для отладки сети. Также можно ознакомиться с руководством по nc.

Команда ping тестирует сетевое подключение.

Статистика в конце показывает количество подключений, совершённых до завершения команды, и время их выполнения.

Git — это популярная система контроля версий. Также можно ознакомиться с руководством по git и нашими материалами.

Переменные окружения

Переменные окружения — это именованные переменные, содержащие значения, используемые одним или несколькими приложениями.

Переменная PATH содержит список каталогов, в которых система ищет исполняемые файлы.

18–30 ноября, Онлайн, От 4125 ₽

Переменная HOME содержит путь к домашнему каталогу текущего пользователя.

Коннекторы

Коннекторы позволяют запускать несколько команд одновременно.

Коннектор Описание
&& Первая команда исполняется всегда, вторая — только в случае успешного завершения первой
|| Первая команда исполняется всегда, вторая — только в случае неудачного завершения первой
; Команды исполняются всегда

Конвейеры

Перенаправление ввода/вывода

Перенаправление вывода

Например, этот код передаст вывод ls в файл, а не на экран:

Если файл не существует, он создаётся, а если существует, то перезаписывается. Во избежание перезаписи стоит использовать команду >> — она дописывает данные в конец файла.

Перенаправление ввода

Команда sort выводит содержимое файла на экран, поскольку мы не перенаправили выход. Это можно сделать так:

Продвинутое перенаправление

Имя Дескриптор Описание
stdin 0 Стандартный поток ввода
stdout 1 Стандартный поток вывода
stderr 2 Стандартный поток вывода ошибок

Например, для перенаправления stderr в test.txt нужно сделать следующее:

Права доступа

Вывод в примере Описание / возможные выводы
Тип файла:
— файл
d каталог
rw- Права доступа владельца файла
rw- Права доступа членов группы-владельца файла
r– Права доступа прочих пользователей
user Имя владельца файла
group Имя группы-владельца файла

chmod

Команда chmod изменяет права доступа файла. Вот типичные сочетания флагов для изменения прав конкретных пользователей:

Буква Пользователь
u Владелец
g Член группы
o Прочие пользователи
a Все пользователи

Кроме того, chmod можно использовать с восьмеричными числами, где 1 — это наличие прав, а 0 — отсутствие:

Следующая команда сработает так же, как и предыдущая:

Источник

Bash в примерах. Часть первая.

Основы программирования в bash

Введение

Вы, должно быть, пока не представляете зачем нужно учиться программированию в bash. Вот несколько причин:

Bash уже есть у вас в системе

Если вы проверите, то скорее всего обнаружите, что bash уже запущен у вас в системе. Даже если вы используете другой shell в качестве командного интерпретатора, bash наверняка установлен, потому что он является стандартной командной оболочкой в линуксе. Так как bash уже запущен, выполнение скриптов написанных на bash-е является эффективным, потому что они разделяют часть оперативной памяти с уже запущенным процессом bash. Да и зачем загружать еще один интерпретатор, если у вас уже есть bash, который справляется со своей работой и делает это хорошо?

Вы уже используете его

Но bash не просто запущен в вашей системе, вы еще ежедневно взаимодействуете с ним. Он всегда рядом, так что есть смысл научиться управляться с ним чтобы полноценно использовать все его возможности. После этого ваше общение с линуксом станет намного веселее и продуктивнее. Но почему вы должны учиться программировать? Все просто: вы уже мыслите в терминах исполнения программ, копирования файлов и перенаправления вывода программ. Не должны ли вы теперь изучить язык, который позволит вам строить из этих простых элементов мощные и экономящие ваше время конструкции с использованием которых вы уже знакомы? Командная оболочка открывает перед вами весь потенциал UNIX. А bash это командная оболочка линукс. Он связывает вас с компьютером. Изучив bash, вы автоматически увеличите свою производительность использования UNIX или Linux — все настолько просто.

Перед началом

Неправильный подход к изучению языка bash может сбить вас с толку. Многие новички вводят команду man bash чтобы прочитать страницу со справкой, которая содержит только краткое техническое описание функционала командной оболочки. Другие вызывают info bash (чтобы посмотреть документацию в формате info), но получают или ту же страницу мануала или немногим более удобный для пользователя материал.

Новички могут быть немного разочарованы, узнав что стандартная справка не может предоставить всей информации и предназначена для пользователей уже знакомых с основами программирования на языке shell. В мануале много замечательно организованной технической информации, но для новичков ее польза невелика.

Эта серия статей поможет вам освоиться в командной строке. В этом пособии описано как использовать основные синтаксические конструкции языка shell для написания своих скриптов. Я постараюсь объяснить все простым языком, чтобы вы не только поняли как это все работает, но и разобрались как это использовать. Прочитав эту серию статей, вы научитесь писать свои собственные скрипты и будете комфортно себя чувствовать в командной строке. После этого вы сможете пополнять свои знания читая (и понимая!) стандартную документацию по bash. Давайте начнем.

Переменные окружения

В bash как и практически во всех остальных командных оболочках пользователь может создавать и определять свои переменные окружения, которые хранятся как текстовые (ASCII) строки. Одно из самых полезных свойств переменных окружения заключается в том, что они являются стандартной частью модели процессов в UNIX. Это значит, что переменные окружения могут использовать не только скрипты командной оболочки, но и компилированные программы. Когда мы экспортируем переменную окружения в bash, любая программа запущенная нами получает к ней доступ. Хорошим примером служит команда vipw, которая позволяет руту редактировать файл с паролями пользователей (/etc/passwd). Установив переменную окружения EDITOR в значение своего любимого текстового редактора, вы можете указать vipw использовать его, а не редактор по умолчанию.

Переменную в bash-е можно определить следующим способом:

$ myvar=’Это моя переменная окружения!’

Эта команда создает переменную с именем «myvar» которая содержит строку «Это моя переменная окружения!». Следует заметить что: Во-первых, рядом со знаком «=» не должно быть пробелов; (попробуйте и вы увидите, что на команду с пробелами интерпретатор выдает ошибку). Во-вторых, если значение нашей переменной содержит пробелы или знаки табуляции, нужно заключить его в кавычки.

В-третьих, обычно можно использовать двойные кавычки вместо одинарных, но именно в этом примере использование двойных кавычек вызовет ошибку интерпретатора, так как значение нашей переменной содержит один из тех специальных символов (о которых сказано в замечании выше) — «!«, но внутри одинарных кавычек никакие специальные символы не работают. Символ «!» в bash отвечает за так называемую «HISTORY EXPANSION» — работу с файлом истории командной строки (подробности см. в мануале). На смотря на то, что функция работы с историей команд при помощи «!» бывает очень полезной, именно сейчас мы хотим видеть его просто как восклицательный знак.

Давайте посмотрим как можно прочитать значение нашей переменной:

Ставя перед именем переменной знак $, мы сообщаем интерпретатору, что нужно заменить ее значением. Это называется подстановкой переменной (variable substitution/expansion).

Но что будет, если мы попробуем сделать так:

$ echo foo$myvarbar foo

$ echo foo$bar fooЭто моя переменная окружения!bar

Вернемся к упомянутой нами возможности экспортировать переменные. Экспортированная переменная автоматически становится доступна для любого скрипта или программы, запущенной после экспортирования. Shell-скрипт может прочитать значение переменной при помощи встроенных в shell средств работы с переменными окружения, а программы на C — используя функцию getenv(). Вот небольшой пример кода на языке C, который вы можете напечатать и скомпилировать. Он поможет взглянуть на переменные окружения со стороны языка C:

#include #include int main(void)

Сохраните этот код в файл myenv.c, а затем скомпилируйте:

После этого в ващей рабочей директории появится исполняемый файл ‘myenv‘. Запустите его, и он выведет вам значение переменной ‘EDITOR‘ (если оно присвоено). Вот что получилось у меня:

$ ./myenv The editor environment variable is set to (null)

Так как переменная не определена, наша программа не может получить к ней доступ. Давайте создадим эту переменную и присвоим ей какое-нибудь значение:

Так тоже не работает. Мы ожидали что программа напечатает «mousepad», но результат не изменился. Это произошло потому что мы забыли экспортировать переменную ‘EDITOR‘. В этот раз должно сработать:

Итак, мы на примере убедились, что сторонний процесс (в нашем случае программа на C) не может получить доступ к переменной окружения до тех пор пока она не экспортирована. Кроме того, вы можете определить переменную и экспортировать ее одной командой:

Эта команда выполняет то же действие, что и двухшаговая версия (присвоение значения и экспорт). Наступило подходящее время показать как сбросить значение переменной окружения (другими словами — удалить переменную) при помощи ‘unset‘:

Как распарсить строку?

Распарсить строку — значит разделить ее на более короткие составляющие. Это одна из частых операций, встречающихся при написании shell-скриптов. Иногда скрипту нужно определить имя конкретного файла или директории, зная полный (абсолютный) путь к нему. На bash это можно сделать всего одной командой:

basename‘ — очень удобная утилита для расщепления строк на составляющие. Вторая команда — ‘dirname‘ — возвращает другую часть строки (путь к директории где находится файл):

Подстановка команд

Очень полезно знать как присвоить переменной результат выполнения какой-либо команды. Сделать это довольно просто:

То что мы сделали называется подстановка команд. В первой строке примера мы просто заключили команду в конструкцию $( ).

Заметим, что тоже самое можно сделать применив вместо конструкции $( ) обратные кавычки « (клавиша клавиатуры сразу над клавишей Tab):

В баше, как мы видим, можно сделать одно действие несколькими разными способами. Используя подстановку команд, мы можем поместить любую команду в обратные кавычки или в конструкцию $( ) и присвоить ее вывод переменной. Очень полезная вещь! Вот пример как использовать подстановку серии команд соединенных через пайп:

Стоит заметить, что использование конструкции $( ) предпочтительней чем обратных кавычек в shell-скриптах, т.к. она более универсальна по отношению к разным командным интерпретаторам, ее легче набирать и читать и ее можно использовать во вложенных конструкциях:

Расщепление строк для профессионалов

f fo совпадает с шаблоном «*fo» foo food foodf foodfo совпадает с шаблоном «*fo» foodfor foodfort foodforth foodfortho foodforthou foodforthoug foodforthought foodforthought.j foodforthought.jp foodforthought.jpg

После проверки всех этих вариантов, найдено две строки попадающие под шаблон. Bash выбирает самую длинную из них, а затем удаляет эту подстроку и возвращает результат.

Вторая форма подстановки переменной показанная в примере отличается от первой только наличием одного знака хэша (#), а не двух. И bash выполняет те же действия, за исключением того, что удаляет не самую длинную а самую короткую из совпавших с шаблоном подстрок. Как видно, после удаления самой короткой подстроки совпавшей с шаблоном (fo) у нас остается строка «/odforthought.jpg».

Как вы видите, одинарный и двойной знаки процента (% и %%) работают также как «#» и «##», но удаляют подстроку совпавшую с шаблоном от конца строки. Запомните, что можно не использовать знак «*», если вы хотите удалить какое-то конкретное окончание строки.

В этом примере нет разницы использовать % или %%, т.к. есть только одно совпадение. И не забывайте при выборе «#» или «%» смотреть на 3,4 и 5 клавиши клавиатуры.

Мы можем использовать еще одну форму подстановки значения переменной для выделения подстроки по заданной длине и позиции начала:

Эта форма очень удобна. Просто укажите разделяя двоеточиями позицию начала подстроки — первое число и длину подстроки — второе число.

Применение расщепления строк

#!/bin/bash if [ «$<1##*.>» = «tar» ] then echo «Кажется это тарбол.» else echo «На первый взгляд, это не похоже на тарбол.» fi

Первая строка обязательно должна присутствовать в каждом скрипте. Она показывает путь к интерпретатору, который будет выполнять скрипт. Ее синтаксис, как видно из примера — «#! ».

Сохраните текст скрипта из примера в файл mytar.sh, затем измените права доступа к нему ‘chmod 755 mytar.sh‘ (это сделает файл исполняемым). И, наконец, запустите скрипт с аргументом в виде имени файла, как показано в следующем примере:

Конструкция if

Как и во многих языках программирования, в bash есть условные конструкции. Они имеют формат, описанный ниже. Будьте внимательны: слова «if» и «then» должны находится на разных строках. Старайтесь выравнивать горизонтально всю конструкцию, включая заключительный «fi» и все «else». Это делает код намного удобнее для чтения и отладки. В дополнении к простой форме «if,else» есть еще несколько других форм условных конструкций:

if [ условие ] then действие fi

В приведенном выше примере ‘действие’ выполняется только если ‘условие’ верно, в противном случае скрипт продолжает выполнение инструкций со строки идущей за «fi».

А эта конструкция последовательно проверяет условия и если они верны, то исполняет соответствующее действие. Если ни одно из условий не верно, то выполняется ‘действие_x’ стоящее после ‘else’ (если оно есть). Потом продолжается исполнение команд идущих за этой конструкцией «if,then,else», если таковые есть.

В следующей части

В этой статье мы рассмотрели базовую функциональность bash. Пришло время немного ускориться и начать писать свои собственные shell-скрипты. В следующей части пособия я расскажу о функциях, циклах, пространстве имен и о других важных вещах. После этого мы будем готовы писать относительно сложные скрипты. До встречи!

Источник

Поделиться с друзьями
admin
Оцените автора
( Пока оценок нет )
Как переводится?
Adblock
detector