Регулярные выражения в командной оболочке Bash

bash (Bourne again shell) — усовершенствованная и модернизированная вариация командной оболочки Bourne shell (Оболочка sh Bourne shell).

Первая строка в любой программе BASH

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

#!/bin/bash

Первый символ #, второй символ — !. Сразу за ними (без каких-либо пробелов) путь до интерпретатора: /bin/bash. И сразу после него перенос строки. Снова никаких пробелов.

Это всё важно. Иначе могут возникать ошибки, которые при первом взгляде не выявить: пробельные символы не видны, а кто может догадаться о том, что кто-то по доброте душевной решил не экономить и наставить лишних символов там, где не надо? 😉

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

Разбираемся с файлами /etc/profile и /etc/bashrc

Павел Соловьёв Full Stack Developer #администрирование 10 сентября, 2015 363

Недавно я столкнулся со следующей проблемой: приложение не сохраняло настройку umask, заданную в профиле root-пользователя, или в файле /etc/profile. Немного разобравшись в вопросе, я понял, что приложение использует только ту настройку umask, которая задана в  /etc/bashrc, не принимая даже те значения, которые являются его же собственными сценариями запуска.

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

Для чего нужен файл /etc/profile?

Если вы используете Linux, то вам наверняка знакомы файлы .profile или .bash_profile, размещенные в вашем домашнем каталоге. Эти файлы используются для задания элементов окружения для оболочки пользователя. Таких элементов, как, например, umask, и таких переменных, как PS1 или PATH.

Файл /etc/profile не очень-то отличается от этих файлов. Он используется для задания общесистемных переменных окружения в оболочках пользователя. Иногда это те же переменные, что и в .bash_profile, но этот файл используется для задания первоначальных PATH или PS1 для всех пользователей оболочек системы.

/etc/profile.d

Помимо задания элементов окружения, файл  /etc/profile выполняет сценарии внутри /etc/profile.d/*.sh. Если вы хотите задать свои собственные переменные окружения для всей системы, вам следует поместить свою конфигурацию в сценарий оболочки в  /etc/profile.d.

Для чего нужен файл /etc/bashrc?

Помимо .bash_profile, в своем домашнем каталоге вы также часто будете встречать файл .bashrc. Этот файл предназначен для задания псевдонимов команд и функций, используемых пользователями оболочки bash.

Аналогично тому, как /etc/profile является общесистемной версией  .bash_profile, файл  /etc/bashrc в Red Hat и файл /etc/ в Ubuntu являются общесистемной версией .bashrc.

Стоит отметить, что в Red Hat реализация /etc/bashrc также выполняет сценариий оболочки в /etc/profile.d, но только если пользовательская оболочка является Интерактивной оболочкой (т.е. Login Shell (стартовой оболочкой))

Когда используются эти файлы?

То, когда выполняется каждый из этих файлов, зависит от типа выполняемого логина. В Linux имеется два типа стартовых оболочек (login shells) — Интерактивные оболочки и Неинтерактивные оболочки. Интерактивная оболочка используется, когда пользователь может взаимодействовать с оболочкой, т.е., например, типичное приглашение командной строки bash. Неинтерактивная оболочка используется, когда пользователь не может взаимодействовать с оболочкой, т.е. выполнение bash-сценариев.

Читайте также:  Установка и настройка расширения friGate в разных браузерах

Разница проста: файл /etc/profile выполняется только для интерактивных оболочек, а файл /etc/bashrc – как для интерактивных, так и для неинтерактивных. Вообще-то, в Ubuntu файл /etc/profile вызывает файл /etc/bashrc напрямую.

Интерактивная оболочка и неинтерактивная оболочка: Сравнение

Чтобы на примере сравнить интерактивную и неинтерактивную оболочки, я добавлю переменную в оба файла /etc/profile и /etc/ в своей Ubuntu.

/etc/profile

grep TEST /etc/profile export TESTPROFILE=1

/etc/

grep TEST /etc/ export TESTBASHRC=1 Интерактивная оболочка

Ниже приведен пример интерактивной оболочки. В этом случае были выполнены оба файла /etc/profile и /etc/

su — env | grep TEST TESTBASHRC=1 TESTPROFILE=1 Неинтерактивная оболочка

В этом примере мы выполняем команду через оболочку SSH, которая является неинтерактивной; поскольку это неинтерактивная оболочка, выполняется только файл /etc/

# ssh localhost «env | grep TEST» [email protected]’s password: TESTBASHRC=1 Заключение

В моем случае приложение не признает значение umask, заданное в файле /etc/profile, но признает значение в файле /etc/bashrc. Это говорит о том, что подпроцесс начинается как неинтерактивная оболочка. Поскольку предлагаемый способ изменения переменных окружения заключается в добавлении сценария оболочки в /etc/profile.d, в моем случае лучше задать значение umask в файле /etc/bashrc.

bash

Об авторе Павел Соловьёв Комментарии Пока что нет комментариев, вы можете быть первым. Войти или Регистрация , чтобы оставлять комментарии.

Пример BASH Скрипта с Оператором CASE

#!/bin/bash printf ‘Какой Linux дистрибутив Вы знаете? ‘ read DISTR case $DISTR in ubuntu) echo «Я тоже знаю Ubuntu! Эта система основана на Debian.» ;; centos|rhel) echo «Эй! Это мой любимый серверный дистрибутив!» ;; windows) echo «Очень смешно…» ;; *) echo «Хмм, кажется я никогда не использовал этот дистрибутив.» ;; esac

Примеры работы скрипта:

$ ./ Какой Linux дистрибутив Вы знаете? centos Эй! Это моя любимая серверная операционная система! $ ./ Какой Linux дистрибутив Вы знаете? rhel Эй! Это моя любимая серверная операционная система! $ ./ Какой Linux дистрибутив Вы знаете? ubuntu Я тоже знаю ubuntu! Это операционная система, основанная на Debian. $ ./ Какой Linux дистрибутив Вы знаете? pfff Хмм, кажется я никогда не использовал этот дистрибутив.

Приведем примеры

. (точка)

Используется для соответствия любому символу, который встречается в поисковом запросе. Например, можем использовать точку как:

$ grep «d.g» file1

Это регулярное выражение означает, что мы ищем слово, которое начинается с ‘d’, оканчивается на ‘g’ и может содержать один любой символ в середине файла с именем ‘file1’. Точно так же мы можем использовать символ точки любое количество раз для нашего шаблона поиска, например:

T……h

Этот поисковый термин будет искать слово, которое начинается с ‘T’, оканчивается на ‘h’ и может содержать любые шесть символов в середине.

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

$ grep «N[oen]n» file2

Здесь мы ищем слово, которое начинается с ‘N’, оканчивается на ‘n’ и может иметь только ‘o’, ‘e’ или ‘n’ в середине. В квадратных скобках можно использовать любое количество символов. Мы также можем определить диапазоны, такие как ‘a-e’ или ‘1-18’, как список совпадающих символов в квадратных скобках.

Это похоже на оператор отрицания для регулярных выражений. Использование [^ ] означает, что поиск будет включать в себя все символы, кроме тех, которые указаны в квадратных скобках. Например:

Читайте также:  12 гаджетов Apple, которые перевернули мир с ног на голову

$ grep «St[^1-9]d» file3

Это означает, что у нас могут быть все слова, которые начинаются с ‘St’, оканчиваются буквой ‘d’ и не содержат цифр от 1 до 9.

До сих пор мы использовали примеры регулярных выражений, которые ищут только один символ. Но что делать в иных случаях? Допустим, если требуется найти все слова, которые начинаются или оканчиваются символом или могут содержать любое количество символов в середине. С этой задачей справляются так называемые метасимволы-квантификаторы, определяющие сколько раз может встречаться предшествующее выражение: + * & ?

{n}, {n m}, {n, } или { ,m} также являются примерами других квантификаторов, которые мы можем использовать в терминах регулярных выражений.

* (звездочка)

На следующем примере показано любое количество вхождений буквы ‘k’, включая их отсутствие:

$ grep «lak*» file4

Это означает, что у нас может быть совпадение с ‘lake’ или ‘la’ или ‘lakkkkk’.

Следующий шаблон требует, чтобы хотя бы одно вхождение буквы ‘k’ в строке совпадало:

$ grep «lak+» file5

Здесь буква ‘k’ должна появляться хотя бы один раз, поэтому наши результаты могут быть ‘lake’ или ‘lakkkkk’, но не ‘la’.

В следующем шаблоне результатом будет строка bb или bab:

$ grep «ba?b» file6

С заданным квантификатором ‘?’ мы можем иметь одно вхождение символа или ни одного.

Важное примечание! Предположим, у нас есть регулярное выражение:

$ grep «S.*l» file7

И мы получаем результаты ‘Small’, ‘Silly’, и ещё ‘Susan is a little to play ball’. Но почему мы получили ‘Susan is a little to play ball’, ведь мы искали только слова, а не полное предложение?

Все дело в том, что это предложение удовлетворяет нашим критериям поиска: оно начинается с буквы ‘S’, имеет любое количество символов в середине и заканчивается буквой ‘l’. Итак, что мы можем сделать, чтобы исправить наше регулярное выражение, чтобы в качестве выходных данных мы получали только слова вместо целых предложений.

Для этого в регулярное выражение нужно добавить квантификатор ‘?’:

$ grep «S.*?l» file7

или символ экранирования

Символ » используется, когда необходимо включить символ, который является метасимволом или имеет специальное значение для регулярного выражения. Например, требуется найти все слова, заканчивающиеся точкой. Для этого можем использовать выражение:

$ grep «S.*?.» file8

Оно будет искать и сопоставлять все слова, которые заканчиваются точкой.

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

Переменные и параметры скрипта

Приведу как пример небольшой пример, который мы разберем:

#!/bin/bash #указываем где у нас хранится bash-интерпретатор parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скрипта script_name=$0 #присваиваем переменной script_name значение имени скрипта echo "Вы запустили скрипт с именем $script_name и параметром $parametr1" # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной. echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’ # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных. exit #Выход с кодом 0 (удачное завершение работы скрипта)

Результат выполнения скрипта:

[email protected]:~$ ./ qwerty Вы запустили скрипт с именем ./ и параметром qwerty Вы запустили скрипт с именем $script_name и параметром $parametr1

После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными:

Читайте также:  Ubuntu Desktop против Ubuntu Server: какая разница?

$DIRSTACK — содержимое вершины стека каталогов $EDITOR — текстовый редактор по умолчанию $EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как… $UID — реальный идентификатор, который устанавливается только при логине. $FUNCNAME — имя текущей функции в скрипте. $GROUPS — массив групп к которым принадлежит текущий пользователь $HOME — домашний каталог пользователя $HOSTNAME — ваш hostname $HOSTTYPE — архитектура машины. $LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов $OLDPWD — прежний рабочий каталог $OSTYPE — тип ОС $PATH — путь поиска программ $PPID — идентификатор родительского процесса $SECONDS — время работы скрипта(в сек.) $# — общее количество параметров переданных скрипту $* — все аргументы переданыне скрипту(выводятся в строку) [email protected] — тоже самое, что и предыдущий, но параметры выводятся в столбик $! — PID последнего запущенного в фоне процесса $$ — PID самого скрипта

Цветной терминал (консоль) в Linux

В Debian 8 достаточно для root раскоментировать строки в /root/.bashrc

# You may uncomment the following lines if you want `ls’ to be colorized: export LS_OPTIONS=‘—color=auto’ eval "`dircolors`" alias ls=‘ls $LS_OPTIONS’ alias ll=‘ls $LS_OPTIONS -l’ alias l=‘ls $LS_OPTIONS -lA’

Для пользовательской консоли включить force_color_prompt=yes в файле /home/<username>/.bashrc

Позиционные переменные (параметры запуска скрипта)

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

  • $0 … $9 — при запуске допускается не более 9 параметров передавать в скрипт. Переменная $0 является именем скрипта.
  • $# — количество параметров переданных скрипту
  • $? — код возврата программы. echo $? — вывести ошибку с которой закончил выполняться предыдущий скрипт (программа), например, выведет 0 (true) если имя пользователя root

    test "root" = "$USER" ; echo $?

  • $* и [email protected] — все параметры командной строки. echo $* — выведет все значения параметров.
  • $! — PID программы, запущенной в background режиме.
  • $$ — PID процесса shell.

Отладка скриптов bash

  • Как отлаживать скрипты на bash

Для отладки скриптов bash можно использовать встроенный набор команд. Можно включать и выключать режим отладки используя следующие команды внутри скрипта:

  • set -x — (set -o xtrace) показывать команды и параметры, которые выполняются;
  • set -v — (set -o verbose) печатает входные строки сразу по мере их считывания;
  • set -f — (set -o noglob) отключается генерация имени файла с помощью метасимволов (подстановка).

В одном и том же скрипте вы можете включать и выключать отладочный режим столько раз, сколько это необходимо. Символ "-" используется для активации параметра командной оболочки, а символ "+" — для его деактивации.

Пример. Отладка прервется после первого выполнения цикла, что будет видно в результате выполнения этого скрипта.

#!/bin/bash clear # включаем режим отладки set -x for i in 0 1 2 3 4 do echo "Console number is $i" # выключаем режим отладки set +x done exit 0Массивы bash

#!/bin/bash car=(bmw mers lada audi) # вывести второй элемент массива echo ${car[1]} # вывести все элементы массива echo ${car[*]}Взаимодействие с пользователем