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

В этой статье описывается базовый синтаксис и приводится пример BASH скрипта с использование оператора CASE.

Пример 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 Хмм, кажется я никогда не использовал этот дистрибутив.

Как узнать правильный путь к интерпретатору BASH

Обычно в linux интерпретатор BASH находится по пути /bin/bash, но там его может не быть по независящим от вас причинам. Тогда имеем смысл попробовать ввести команду whereis bash и посмотреть на результаты, которые она выдаст:

[email protected]:~# whereis bash bash: /bin/bash /etc/ /usr/share/man/man1/

Как видно на примере выше, было найдено три совпадения:

  1. /bin/bash — путь до интерпретатора (именно то, что требуется)
  2. /etc/ — конфигурационный файл с переменными окружения BASH пользователя
  3. /usr/share/man/man1/ — файл справочной информации для BASH

Нужно помнить, что если whereis не находит BASH, то это не значит, что его нет в системе. Тут имеет смысл посмотреть глобальную переменную окружения $PATH, но обычно этого не требуется. Поэтому дальше не вижу смысла углубляться в детали.

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

. (точка)

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

$ grep «d.g» file1

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

Читайте также:  Как зайти под суперпользователем в linux

T……h

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

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

$ grep «N[oen]n» file2

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

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

$ 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’.

Читайте также:  10 лучших легких дистрибутивов Linux для старых компьютеров

В следующем шаблоне результатом будет строка 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

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

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

Переменные

  • Используйте ключевое слово read в скрипте, чтобы запросить данные™ у пользователя, запускающего скрипт™.
  • Используйте подстановку команд™, чтобы использовать результат команды и назначить его переменной. Например, команда date +%d-%m-%y показывает текущую дату в формате день-месяц-год. Чтобы сделать это в сценарии, вы можете™ использовать TODAY=$(date +%d-%m-%y). Для подстановки команд™ вам просто™ нужно поместить команду, результат которой вы хотите™ использовать, между скобками.

Листинг 3.

#!/bin/bash if [ -z $1 ]; then echo enter a text read TEXT else TEXT=$1 fi echo you have entered the text $TEXT exit 0if… then… else… fitesttestif [ -z $1 ] …-z $1-z testif [ -z $1 ]

thentestthenthenreadread TEXTelseВы можете™ попрактиковаться на этом примере при работе™ с вводом™.

  1. Откройте редактор и создайте файл с именем™ text. Введите содержимое кода из листинга 3 в этот файл.
  2. Запишите файл на диск и выполните chmod +x text, чтобы сделать его исполняемым.
  3. Запустите скрипт™, выполнив ./text и без дополнительных аргументов. Вы увидите, что он запрашивает ввод.
  4. Запустите скрипт™, используя «hello» в качестве аргумента (./text hello). Результат отобразит «you have entered the text hello» в STDOUT™.
Читайте также:  Как найти и удалить битые символические ссылки в Linux

Дополнение Termux:Widget

С помощью дополнения Termux:Widget на рабочий стол устройства можно добавить виджет со списком bash-скриптов для их быстрого запуска.

Пример виджета:

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

а) в терминале Termux. Т.е. при запуске скрипта будет открыто окно терминала Termux, в котором  и будет происходить выполнение скрипта.

В этом случае скрипты нужно положить в специальный каталог .shortcuts в домашнем каталоге.

Создание каталога:

$ mkdir -p $HOME/.shortcuts

1 $ mkdir p $HOME/.shortcuts

б) в фоне. Т.е. скрипт будет выполнятся “сам по себе”, без окна терминала Termux.

Для запуска фоновых скриптов их нужно поместить в подкаталог  .shortcuts/tasks домашнего каталога.

$ mkdir -p $HOME/.shortcuts/tasks

1 $ mkdir p $HOME/.shortcuts/tasks

Примечание:

Если скрипт запускается в фоне, и открытает какие-либо визуальные окна (например, запускает другое приложение), то в системе Android (начиная, примерно, с версии 7) приложению Termux нужно добавить соответствующее разрешение. Например, в Android 9: Свойства приложения (О приложении) -> Другие разрешения -> Отображать всплывающие окна, когда запущено в фоновом режиме. Иначе ничего не отобразится.

Я храню сами файлы скриптов во внешней памяти устройства, а не в приватном участке памяти для приложения (например, каталог $HOME, или  /data/data/com.termux/files/home). Т.к., если приложение Termux будет удалено, то его приватный каталог тоже очистится.

Для этого, с помощью команды ln, на сами файлы скриптов можно создать символьные ссылки (симлинки), которые положить в каталог  .shortcuts:

$ ln s $HOME/storage/shared/real_path_to_scripts/script.sh $HOME/.shotcuts/script.sh

Также, не забудьте сделать исходный файл скрипта исполняемым:

$ chmod +x $HOME/storage/shared/real_path_to_scripts/

1 $ chmod +x $HOME/storage/shared/real_path_to_scripts/script.sh