20 июл. 2000 г.

Язык bash часть 2

Язык командного интерпретатора bash. Part 2. "Подстановки"

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

Подстановка параметров

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

$ cwd=/home/istergul # присваиваем параметру cwd путь к домашнему каталогу
$ cd $cwd # переходим в домашний каталог, подставляя в команду cd параметр cwd

Вывести на экран файл readme из домашнего каталога теперь можно, введя команду (если конечно, данный файл существует):
$ more ${cwd}/readme

Здесь имя параметра взято в скобки. Это делать не обязательно, но это позволит отделить имя параметра от окружающих символов с целью его выделения.
Возможности bash позволяют производить подстановку команд, то есть заменять имя команды на результат её выполнения. Например:

$ cd ~
$ cwd=`pwd`

Или же так:
$ cwd=$(pwd)

Теперь переменная cwd будет содержать путь к вашему домашнему каталогу.
Вот ещё пример командной подстановки:

$ tar -czf /backup/$(date +%A).tgz /etc

Команда создаёт архив в директории /etc с названием /backup/<текущий день недели>.tgz.
В следующем примере команда добавляет в приглашение командной строки вывод последней строки из системного log-файла.

$ PS1="\$(tail -1 /var/log/messages)\n$PS1"

Производить подстановки можно не только с определёнными вами параметрами, но и с переменными окружения. Например, выведем поэкранно список всех процессов, запущенных от вашего имени:
$ ps ef | grep $USER | less

Останавливаться на командах ps, grep и less не буду. Вы можете узнать о них, используя команду man.

Подстановка символов шаблонов


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

* — произвольная строка символов, в том числе пустая. Следует заметить, что сюда не входят имена файлов, начинающиеся с ".", то есть скрытые файлы.
$ ls ./*.txt # все файлы в текущем каталоге с расширением txt

? – одиночный символ;
$ ls ./file?.txt # файлы в текущем каталоге с расширением txt, начинающиеся с file (такие как file1.txt, filex.txt и др.)

[mMx] – любой символ из перечисленных;
$ ls ./file[2N].txt # файлы в текущем каталоге, такие как file2.txt, fileN.txt

[a-zA-F] – любой символ из указанных интервалов;

$ ls ./file[3-49] # файлы в текущем каталоге, такие как file3, file4, file9

[^a-zxy] – любой символ, не указанный в скобках;
$ ls ./file[^0].txt # все файлы в текущем каталоге, кроме file0.txt

Для того чтобы символы шаблонов использовать как обычные символы, их нужно экранировать:
$ touch file\* # создать файл с именем file*


Другие подстановки

Подстановка тильды:

~ — заменяется на имя вашего домашнего каталога;
~+ — заменяется на путь к текущему каталогу;
~- — заменяется на путь к предыдущему каталогу;
~istergul/Desktop — заменяется на путь к папке Desktop в домашней папке istergul.


Раскрытие скобок:
name1{name2,name3}name4 – заменяется на name1name2name4 name1name3name4. Пробелы ставить внутри скобок не нужно! Данную функцию можно применять, когда нельзя составить общего шаблона. Например:

$ cat /home/istergul/{file1,name1,readme} > file


Подстановка арифметических выражений
$((выражение)) или $[выражение] – эквивалентные формы записи. Внутри выражения выполняются установки параметров. Приоритет арифметических операций можно посмотреть man bash в секции ARIFMETIC EVALUATION. Например, количество часов прошедшее с момента запуска оболочки, можно подсчитать следующим образом:

$ echo $(( $SECONDS/3600 ))
 
=======================Добавки из комментов========================
Простой пример командной постановки:

1)

tar -czf /backup/$(date +%A).tgz /etc

Создает архив директории /etc с названием(сегодня) /backup/Четверг.tgz, 
а если выполню завтра то будет /backup/Пятница.tgz



2)

PS1="\$(tail -1 /var/log/messages)\n$PS1"

В приглашении командной строки добавился вывод последней строки из
 системного log-файла