Меню

Linux: подстановка и экранирование

08.05.2018 - Bash, Linux
Linux: подстановка и экранирование

Подстановка

Простая последовательность символов, например *, может много значить для командной оболочки. Процесс, который происходит при этом, называется подстановкой (expansion).

$ echo this is a test
this is a test
$ echo *
//Выведет все текущие каталоги

Подстановка путей

Механизм работы групповых символов называется подстановкой пути (pathname expansion).

$ echo D*
//Вывести каталоги начинающиеся на D
$ echo *s
//Вывести каталоги заканчивающиеся на s
$ echo [[:upper:]]* 
//Вывести каталоги начинающиеся на заглавную
echo /usr/*/share
//Вывести каталоги у которых корневая папка `usr` и дочерняя `share`

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

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

$ echo ~
/home/me
$ echo ~foo
/home/foo

Подстановка пути для скрытых файлов

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

ls -d .[!.]?*

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

Подстановка результатов арифметических выражений

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

$ echo $((2+2))
//Т.е. используется след формат
$((выражение))

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

$ echo $(($((5**2)) * 3))

Также допускается использование одиночных круглых скобок для группировки.

$ echo $(((5**2) * 3))

При это будет использована одна операция подстановки вместо двух

$ echo $((5/2))
//2
$ echo $((5%2))
//1

Подстановка фигурных скобок

Создается множество текстовых строк

echo Впереди-{A,B,C}-позади
Впереди-A-Позади Впереди-B-Позади Впереди-C-Позади

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

$ echo Число_{1..5}
Число_1 Число_2 Число_3 Число_4 Число_5
$ echo {Z..A}
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
$ echo a{A{1,2},B{3,4}}b
aA1b aA2b aB3b aB4b

Допустим нам надо создать каталоги по годам:

$ mkdir Pics
$ cd Pics
$ mkdir {2009..2011}-0{1..9} {2009..2011}-{10..12}
$ ls
2009-01  2009-06  2009-11  2010-04  2010-09  2011-02  2011-07  2011-12
2009-02  2009-07  2009-12  2010-05  2010-10  2011-03  2011-08
2009-03  2009-08  2010-01  2010-06  2010-11  2011-04  2011-09
2009-04  2009-09  2010-02  2010-07  2010-12  2011-05  2011-10
2009-05  2009-10  2010-03  2010-08  2011-01  2011-06  2011-11

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

Более полезны в скриптах баша. Речь идет о подстановке переменных. Некоторые переменные уже определены в системе. Например USER хранит ваше имя пользователя. Подстановка переменной осуществляется следующим образом:

$ echo $USER

Чтобы увидеть список всех доступных переменных, выполните следующую команду:

$ printenv | less

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

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

$ echo $(ls)
$ ls -l $(which cp)
-rwxr-xr-x 1 root root 151024 Mar  2  2017 /bin/cp

В последнем случае, результат команды which cp передается как аргумент команде ls благодаря чему мы получаем инфу о программе cp, не зная полного пути к ней.
Можно использовать конвееры:

$ file $(ls /usr/bin/* | grep zip)
/usr/bin/gpg-zip:    POSIX shell script, ASCII text executable
/usr/bin/zipdetails: a /usr/bin/perl script, ASCII text executable

В этом примере результаты конвейера превратились в список аргументов команды file.
Вместо доллара и скобок можно использовать более старый синтаксис

$ ls -l `which cp`

Экранирование

Двойные кавычки

Если заключить текст в двойные кавычки, все спец символы потеряют своё спец значение и будут интерпретироваться как обычные символы.
Исключение:
* $ — знак доллара
* \ — обратный слэш
* « ` — обратный апостроф

Т.е. всё еще будут выполняться:
* подстановка параметров
* подстановка значений арифметических выражений
* подстановка команд

$ ls -l "Два слова.txt"
$ mv "Два слова.txt" Два_слова.txt
$ echo "$USER $((2+2)) $(cal)"

Пробелы и перевод строки — считаются разделителями на аргументы

$ echo "this is a     test"
this is a     test
$ echo $(cal)
April 2018 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
$ echo "$(cal)"

В первом случае подстановка команд без кавычек привела к созданию командной строки с 38 аргументами, а во втором случае получилась командная строка с одним аргументом, включающим внутренние пробелы и символы перевода строки

Одиночные кавычки

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

$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
text /home/igenex/123.txt /home/igenex/eat_more.txt /home/igenex/ls-error.txt /home/igenex/ls.txt a b foo 4 igenex
$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
text ~/*.txt {a,b} foo 4 igenex
$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER

Экранирование символов

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

$ echo "Баланс $USER: \$100005.00"
Баланс igenex: $100005.00

Также экранирование используется чтобы можно было использовать спецсимволы в именах файлов. К таким символам относятся: $, !, &, и др. Чтобы включить спецсимвол в имя файла, его нужно экранировать:

$ mv bad\&filename good_filename

Чтобы включить сам экранирующий символ, его также нужно экранировать — \\

Управляющие последовательности

Управляющие последовательности
Параметр -e команды echo включает интерпретацию управляющих последовательностей. Их можно также заключать в конструкцию $' '.
Например:

$ sleep 10; echo -e "Time's up\a"
$ sleep 19; echo "Time's up" $'\a'
Метки: , ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *