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

Termux – приложение с открытым исходным кодом, реализующее Linux-подобную среду, взаимодействие с которой происходит посредством консоли без необходимости иметь root-права на устройстве. Доступно для устройств с Android >= 7 (раньше было 5).

Основы регулярных выражений

В общем виде синтаксис команды ‘grep’ выглядит следующим образом:

$ grep поисковый_запрос_regex расположение_файла

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

. будет соответствовать любому символу;
[ ] будет соответствовать диапазону символов;
[^ ] будет соответствовать всем символам, кроме указанных в фигурных скобках;
* будет соответствовать любому количеству символов, предшествующих звездочке, в том числе нулю;
+ будет соответствовать одному или нескольким из стоящих перед ним выражений;
? будет соответствовать нулю или одному из стоящих перед ним выражений;
{n} будет соответствовать ‘n’ повторениям предшествующих выражений;
{n,} будет соответствовать не менее ‘n’ повторениям предшествующих выражений;
{n m} будет соответствовать не менее ‘n’ и не более ‘m’ повторениям предшествующих выражений;
{,m} будет соответствовать не более или равному ‘m’ повторениям предшествующих выражений;
является escape-символом (символом экранирования), используемым, когда нужно включить один из метасимволов.

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

Дополнение 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 будет удалено, то его приватный каталог тоже очистится.

Читайте также:  Как скачать видео с YouTube и законно ли это?

Для этого, с помощью команды 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

Циклы. Цикл until-do.

Синтаксис

until TEST-COMMAND; do CONSEQUENT-COMMANDS; done # синтаксис для записи цикла в одну строкуОператор case

Оператор case всегда завершается ключевым словом esac.

case строка in шаблон) список операторов ;; [ шаблон) список операторов [;;] ] esac

Оператор case поочерёдно сравнивает строку с шаблонами. Если шаблон совпадает, то выполняется группа операторов, находящихся между шаблоном и специальными символами ";;". После выполнения всех строк управление передается операторам, находящимся за ключевым словом esac.

Пустой оператор

Пустой оператор ":" . Ничего не делает. Возвращает значение "0".

Функции

Функцию в shell можно определить двумя способами: при помощи оператора function или после имени функции написать открывающую и закрывающую круглые скобки. Тело функции располагается между фигурными скобками.

eval arg1 [arg2] … [argN]

Транслирует список аргументов, из списка, в команды.

Пример. Демонстрация команды eval

#!/bin/bash y=`eval ls -l` # Подобно y=`ls -l` echo $y # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках. echo echo "$y" # Если имя переменной записать в кавычках — символы перевода строки сохраняются. echo; echo y=`eval df` # Аналогично y=`df` echo $y # но без символов перевода строки. # Когда производится подавление вывода символов LF (перевод строки), то анализ #+ результатов различными утилитами, такими как awk, можно сделать проще. exit 0getopts

getopts — это встроенная в shell команда, позволяющая разобрать командную строку, передаваемую программе. Она понимает только параметры, написанные в стиле Что такое POSIX, т.е "-v -t -f file" и т.п.

Читайте также:  Как заработать в Твиттер: 6 способов заработка

trap — jбработка прерываний

Команда trap позволяет переопределить стандартную реакцию программы на получаемые сигналы. Бывает необходимо защитить выполнение программы от прерывания. Формат команды trap:

trap 'список команд' сигналы

Если в системе возникнут прерывания, чьи сигналы перечислены через пробел в "сигналы", то будет выполнен "список команд", после чего (если в списке команд не была выполнена команда "exit") управление вернется в точку прерывания и продолжится выполнение командного файла.

Наиболее часто приходится встречаться со следующими прерываниями, соответствующими сигналам:

0 выход из интерпретатора, 1 отбой (отключение удаленного абонента), 2 прерывание от <Del>, 9 уничтожение (не перехватывается), 15 окончание выполнения.

Например, если перед прекращением по прерываниям выполнения какого то командного файла необходимо удалить файлы в "/tmp", то это может быть выполнено командой "trap":

trap 'rm /tmp/* ; exit 1' 1 2 15

которая предшествует прочим командам файла. Здесь, после удаления файлов будет осуществлён выход "exit" из командного файла.

Команда "trap" позволяет и просто игнорировать прерывания, если "список команд" пустой. Так например, если команда "cmd" выполняется очень долго, а пользователь решил отключиться от системы, то для продолжения выполнения этой команды можно написать, запустив команду в фоновом режиме:

( trap '' 1; cmd )&RegExp регулярные выражения Bash

  • Регулярные выражения Bash
  • Что такое регулярные выражения?
  • RegExp