Что такое подстановки linux

Linux.yaroslavl.ru

Шаблоны Подстановки Shell
Пред. Глава 3. Введение в Командную Строку След.

Шаблоны Подстановки Shell

Возможно, вы уже использовали символы подстановки, не зная как это называется и что это такое. Когда вы выбираете файл в Windows или когда вы ищете файл, вы используете * для соответствия случайной строке. Например, *.txt соответствует всем файлам с окончаниями .txt в именах. Мы тоже интенсивно использовали их в последнем разделе. Но существует гораздо больше подстановок, чем только *.

Когда вы набираете команду типа ls *.txt и нажимаете Return (ввод), задача поиска файлов, совпадающих с критерием *.txt решается не только командой ls но и самой shell. Здесь требуется небольшое объяснение о том, как командная строка интерпретируется в shell. Когда вы пишете:

командная строка сначала разделяет слова (ls и *.txt в этом примере). Когда оболочка видит * в слове, она будет интерпретировать все слово как шаблон постановки и заменять его именами всех совпадающих файлов. Следовательно, команда, перед тем как оболочка выполняет ее, становится такой ls readme.txt recipe.txt, что дает ожидаемый результат. Другие символы заставляют оболочку реагировать следующим образом:

?: соответствует одному и только одному символу, независимо от того чем этот символ является;

[. ]: соответствует одному символу, найденному в скобках. Символы можно указать как диапазон символов (то есть 1-9) или дискретные значения , или даже и то и другое. Пример: [a-zBE5-7] будет соответствовать всем символам между a и z, B, E, 5, 6 или 7;

[. ]: соответствует любому символу, не находящемуся в скобках. Например, [!a-z], будет соответствовать любому символу который не является буквой в нижнем регистре [5] ;

: соответствует c1 или c2, где c1 и c2 также шаблоны подстановки, которые обозначают что вы можете написать например.

Вот некоторые шаблоны и их значения:

/etc/*conf: все файлы в каталоге /etc с окончаниями в именах conf. Это может соответствовать /etc/inetd.conf, /etc/conf.linuxconf, а также /etc/conf если такой файл существует. Помните, что * может соответствовать пустой строке.

image//*.jpg: все файлы, заканчивающиеся на .jpg в каталогах image/cars, image/space0, (. ), image/space9, если эти каталоги существуют.

/usr/share/doc/*/README: все файлы с именем README во всех каталогах /usr/share/doc непосредственно. Это будет соответствовать /usr/share/doc/mandrake/README, например, но не соответствовать /usr/share/doc/myprog/doc/README.

*[!a-z]: все файлы, имена которых не заканчиваются буквой в нижнем регистре в текущем каталоге.

[5] Осторожно! Если это работает GNU/Linux, то вполне может не работать под другими UNIX-подобными операционными системами. Это зависит от сопоставления порядка (collating order). На некоторых системах [a-z] будет соответствовать a, A, b, B, (. ), z. Не говоря уже о том, что некоторые языки имеют подчеркнутые символы.

Источник

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

Работа с переменными и/или подстановка их значений

То же самое, что и $parameter, т.е. значение переменной parameter. В отдельных случаях, при возникновении неоднозначности интерпретации, корректно будет работать только такая форма записи: $ .

Может использоваться для конкатенации (слияния) строковых переменных.

Если параметр отсутствует, то используется значение по-умолчанию.

Формы записи $ и $ в большинстве случаев можно считать эквивалентными. Дополнительный символ : имеет значение только тогда, когда parameter определен, но имеет «пустое» (null) значение.

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

Если значения параметров не задананы явно, то они принимают значения по-умолчанию.

Оба метода задания значений по-умолчанию до определенной степени идентичны. Символ : имеет значение только когда $parameter был инициализирован «пустым» (null) значением, [1] как показано выше.

Если параметр имеет какое либо значение, то используется alt_value, иначе — null («пустая» строка).

Оба варианта до определенной степени идентичны. Символ : имеет значение только если parameter объявлен и «пустой», см. ниже.

Если parameter инициализирован, то используется его значение, в противном случае — выводится err_msg.

Обе формы записи можно, до определенной степени, считать идентичными. Символ : имеет значение только когда parameter инициализирован «пустым» значением, см. ниже.

Пример 9-13. Подстановка параметров и сообщения об ошибках

Пример 9-14. Подстановка параметров и сообщение о «порядке использования»

Подстановка параметров и/или экспансия. Следующие выражения могут служить дополнениями оператора match команды expr, применяемой к строкам (см. Пример 12-6). Как правило, они используются при разборе имен файлов и каталогов.

Длина переменной / Удаление подстроки

String length (число символов в переменной $var). В случае массивов, команда $ возвращает длину первого элемента массива.

$ и $ возвращает количество аргументов (позиционных параметров) .

Для массивов, $ и $ возвращает количество элементов в массиве.

Пример 9-15. Длина переменной

Удаляет из переменной $var наименьшую/наибольшую подстроку, совпадающую с шаблоном $Pattern. Поиск ведется с начала строки $var.

Пример использования из Пример A-8:

Удаляет из переменной $var наименьшую/наибольшую подстроку, совпадающую с шаблоном $Pattern. Поиск ведется с конца строки $var.

Bash версии 2 имеет ряд дополнительных возможностей.

Пример 9-16. Поиск по шаблону в подстановке параметров

Пример 9-17. Изменение расширений в именах файлов :

Подстановка значений переменных / Замена подстроки

Эти конструкции перекочевали в Bash из ksh .

Подстанавливается значение переменной var, начиная с позиции pos.

Подстанавливается значение переменной var, начиная с позиции pos, не более len символов. См. Пример A-16.

Первое совпадение с шаблоном Pattern, в переменной var замещается подстрокой Replacement.

Если подстрока Replacement отсутствует, то найденное совпадение будет удалено.

Глобальная замена. Все найденные совпадения с шаблоном Pattern, в переменной var, будут замещены подстрокой Replacement.

Как и в первом случае, если подстрока Replacement отсутствует, то все найденные совпадения будут удалены.

Пример 9-18. Поиск по шаблону при анализе произвольных строк

Если в переменной var найдено совпадение с Pattern, причем совпадающая подстрока расположена в начале строки (префикс), то оно заменяется на Replacement. Поиск ведется с начала строки

Если в переменной var найдено совпадение с Pattern, причем совпадающая подстрока расположена в конце строки (суффикс), то оно заменяется на Replacement. Поиск ведется с конца строки

Пример 9-19. Поиск префиксов и суффиксов с заменой по шаблону

Поиск по шаблону всех, ранее объявленных переменных, имена которых начинаются с varprefix .

Примечания

Если $parameter «пустой»,в неинтерактивных сценариях, то это будет приводить к завершению с кодом возврата 127 ( «command not found» ).

Источник

Глава 14. Подстановка команд

Подстановка команд — это подстановка результатов выполнения команды [1] или даже серии команд; буквально, эта операция позволяет вызвать команду в другом окружении.

Классический пример подстановки команд — использование обратных одиночных кавычек (`. `). Команды внутри этих кавычек представляют собой текст командной строки.

Вывод от команд может использоваться: как аргумент другой команды, для установки значения переменной и даже для генерации списка аргументов цикла for.

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

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

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

Подстановка команд позволяет даже записывать в переменные содержимое целых файлов, с помощью перенаправления или команды cat.

Не используйте переменные для хранения содержимого текстовых файлов большого объема, без веских на то оснований. Не записывайте в переменные содержимое бинарных файлов, даже шутки ради.

Пример 14-1. Глупая выходка

Обратите внимание: в данной ситуации не возникает ошибки переполнения буфера . Этот пример показывает превосходство защищенности интерпретирующих языков, таких как Bash, от ошибок программиста, над компилирующими языками программирования.

Подстановка команд, позволяет записать в переменную результаты выполнения цикла. Ключевым моментом здесь является команда echo, в теле цикла.

Пример 14-2. Запись результатов выполнения цикла в переменную

Подстановка команд позволяет существенно расширить набор инструментальных средств, которыми располагает Bash. Суть состоит в том, чтобы написать программу или сценарий, которая выводит результаты своей работы на stdout (как это делает подавляющее большинство утилит в UNIX) и записать вывод от программы в переменную.

Альтернативой обратным одиночным кавычкам, используемым для подстановки команд, можно считать такую форму записи: $(COMMAND).

Источник

Что такое подстановки linux

После того, как команда будет разделена на отдельные лексемы (смотрите раздел «Синтаксис командной оболочки»), над этими лексемами или словами могут быть выполнены дополнительные замены или подстановки значений. Есть восемь видов таких дополнительных действий, которые мы рассматриваем в следующих разделах в той последовательности, в какой они применяются к лексемам.

После выполнения всех этих действий, происходит удаление кавычек.

Раскрытие фигурных скобок

Раскрытие фигурных скобок — это механизм, с помощью которого можно генерировать строки произвольного вида. В шаблонах, которые при этом используются, может присутствовать необязательное НАЧАЛО, за которым между фигурными скобками идет последовательность строк, разделенных запятыми. Затем идет необязательное ЗАВЕРШЕНИЕ. Начало является префиксом всех строк, генерация которых задана внутри фигурных скобок, а завершение просто добавляется к концу каждой строки, полученной перебором слева направо строк, указанных внутри скобок.

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

Фигурные скобки обрабатываются раньше всех других дополнительных подстановок. В полученном результате сохраняются все символы, предназначенные для следующих подстановок. Обработка строго текстовая. Bash не осуществляет интерпретацию каких-либо синтаксических конструкций, расположенных внутри фигурных скобок. Чтобы избежать конфликтов, связанных с подстановкой параметров, строка «$<" при обработке фигурных скобок игнорируется.

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

Замена символа «тильда»

Если слово начинается с символа «тильда» («

«), который не должен быть в кавычках, то все символы до первого слеша, который также не должен быть в в кавычках, (или все символы, если слеш без кавычек отсутствует) считаются префиксом тильды. Если в префиксе тильды нет символов, заключенных в кавычки, то символы, следующие за тильдой, трактуются как возможное имя для входа в систему. Если это имя является пустой строкой, то тильда заменяется на значение переменной окружения HOME. Если значение переменной HOME не установлено, то вместо него подставляется название домашнего директория пользователя, исполняющего командную оболочку. Иначе префикс тильды заменяется названием домашнего директория, связанного с указанным именем входа в систему.

Если префиксом тильды будет «

+», то он будет заменен значением переменной PWD. Если префиксом тильды будет «

-«, то он будет заменен значением переменной OLDPWD, если это значение установлено.

Если символы, следующие после тильды в префиксе тильды, состоят из числа N с необязательным префиксом «+» или «-«, тильда-префикс заменяется элементом из стека директориев, точно таким, какой будет отображаться встроенной командой dirs с аргументом, которым будут символы, следующие после тильды в префиксе тильды. Если в префиксе тильды, кроме символа тильды, указывается только число без предваряющего символа «+» или «-«, то подразумевается символ «+».

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

Для каждой операции присваивания переменной значения проверяется, присутствует ли сразу после символов «:» или «=» префикс тильды, не заключенный в кавычки. Если присутствует, то и в этом случае делается попытка замены тильды. Таким образом, при присваивании значений переменным PATH , MAILPATH и CDPATH можно использовать имена файлов с тильдой и оболочка выполнит такое присваивание с предварительной заменой тильды.

/testdir будет заменена на строку $HOME/testdir , так что если $HOME равно /var/home/franky , в переменную PATH будет добавлен директорий /var/home/franky/testdir .

Подстановка значений праметров и переменных командной оболочки

Символ «$» позволяет указывать параметры, осуществлять подстановку результата работы команд или выполнять замену арифметических выражений результатом их вычисления. Имя параметра или символ, для которого будет выполняться подстановка, может быть заключен в фигурные скобки, которые не являются обязательными, но служат для того, чтобы к переменной не добавлялись символы, идущие сразу после переменной, которые могут быть проинтерпретированы как часть имени.

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

Обычным форматом для подстановки параметра является «$«. Вместо такой строки подставляется значение переменной «PARAMETER». Фигурные скобки необходимы, когда «PARAMETER» является позиционным параметром, в котором используется более одной цифры, либо когда за именем «PARAMETER» следует символ, который не должен интерпретироваться как часть этого имени.

Если первым символом имени «PARAMETER» является восклицательный знак, то Bash вначале производит все подстановки и замены в строке, сформированной из оставшейся части «PARAMETER», рассматриваемой как имя переменной; затем происходит подстановка значений и в дальнейшем при подстановках используется это значение, а не значение самого имени «PARAMETER». Этот механизм известен как косвенная подстановка.

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

Ниже приведен пример косвенной подстановки:

Обратите внимание, что это не то же самое, что и echo $N* .

В следующем примере создается поименованная переменная в случае, если она еще не существует:

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

Мы еще будем рассматривать использование фигурных скобок при работе с переменными в главе 10 «Подробнее о переменных». Более подробную информацию можно также найти в документации по Bash.

Подстановка результата работы команд

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

или, например, внутри обратных кавычек:

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

Когда применяется старый формат записи с использованием обратных слешей, обратные слеши сохраняются за исключением случаев, когда за ними следует символ «$», «`» или «\». Первая обратная кавычка, которой не предшествует обратный слеш, закрывает процедуру подстановки результата работы команд. Если используется формат «$(COMMAND)», то все символы, находящиеся между скобками, представляют собой команду и не рассматриваются отдельно.

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

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

Арифметические выражения

Bash позволяет вычислять арифметические выражения и подставлять полученный результат. Формат записи арифметических выражений следующий:

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

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

Таблица 3.4. Арифметические операторы

Пост-инкремент и пост-декремент переменной

Пред-инкремент и пред-декремент переменной

Унарные минус и плюс

Логическое и побитовое отрицание

Возведение в степень

Умножение, деление, остаток от деления

Левый и правый побитовый сдвиг

Равенство и неравенство

Побитовое исключающее ИЛИ

expr ? expr : expr

Разделитель между выражениями

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

Константы с лидирующим 0 (нулем) интерпретируются как восьмеричные числа. Лидирующие «0x» или «0X» обозначают шестнадцатеричные числа. В остальных случаях числа указываются в формате «[BASE ‘#’] N», где «BASE» является десятичным числом между 2 и 64, которое представляет собой основание числа, а N является собственно числом по этому основанию. Если основание «BASE ‘#'» не указано, то используется основание 10. Для представления цифр, больших 9, используются строчные буквы, заглавные буквы, «@» и «_», в указанном порядке. Если основание «BASE» меньше или равно 36, то строчные и заглавные буквы могут быть использованы для представления чисел от 10 до 35 как взаимозаменяемые.

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

Везде, где это возможно, пользователи Bash должны стараться пользоваться квадратными скобками:

Но, в этом случае будет только вычисляться результат EXPRESSION, и проверка делаться не будет:

Примеры практического использования в скриптах смотрите в разделе «Сравнение чисел».

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

Подстановка процессов поддерживается в системах, в которых есть именованные конвейеры (FIFO) или метод /dev/fd , предназначенный для именования открытых файлов. Используется следующий формат:

Выполняется процесс LIST, причем его входной и выходной потоки подключены к конвейеру FIFO или к некоторому файлу в /dev/fd. Имя этого файла передается в качестве аргумента в текущую команду как результат подстановки. Если используется формат «>(LIST)», будет записан файл, который будет входом для LIST. Если используется формат » и левой скобкой пробелов быть не должно, иначе эта конструкция будет интерпретирована как операция перенаправления.

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

Более подробную информацию смотрите в разделе «Перенаправление и дескрипторы файлов».

Разбиение на слова

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

Оболочка рассматривает каждый символ, входящий в переменную $IFS , как разделитель и по этим символам разбивает результат других подстановок на слова. Если значение IFS не установлено, или его значение равно точно значению «‘ ‘», что задано по умолчанию, то разделителем слов будет служить любая последовательность символов, указанных в IFS . Если в IFS задано значение, отличающее от значения, задаваемого по умолчанию, то в начале и конце слов последовательности пробельных символов «пробел» и «Tab» игнорируются только в тех случаях, когда они присутствуют в значении IFS (т. е. являются пробельными символами IFS ). Любой символ из IFS , не являющийся пробельным символом IFS , вместе с любыми соседними пробельными символами IFS , будут рассматриваться как разделители полей. Последовательности пробельных символов IFS также рассматриваются как разделители. Если значение IFS не определено, то разбиение на слова не происходит.

Явные пустые аргументы («»»» или «»») сохраняются. Неявные пустые аргументы, которые указаны без кавычек и были получены при подстановке параметров, не имеющих значение, удаляются. Если параметр, не имеющий значение, заменяется двойными кавычками, то результирующему аргументу будет присвоено значение null и он будет сохранен.

Оператор Что означает

Если никаких замен и подстановок не производилось, то и разбиение на слова также не выполняется.

Подстановки имен файлов

После того, как будет выполнено разбиение на слова, и если не установлен параметр -f (смотрите раздел «Отладка скрипта по частям»), Bash проверит каждое слово на наличие символов «*», «?», и «[«. Если встретится какой-либо из этих символов, то слово рассматривается как ШАБЛОН и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону. Если соответствующие имена файлов найдены не будут и отключен параеметр nullglob , то слово изменено не будет. Если параметр nullglob включен и соответствий не найдено, то слово удаляется. Если включен параметр nocaseglob командной оболочки, то сравнение производится без учета регистра символов алфавита.

Если шаблон используется для генерации имен файлов и не установлен параметр dotglob , а в шаблоне в начале имени файла или сразу после слеша есть символ «.», то этот же символ должен обязательно присутствовать в именах файлов. Если в шаблоне есть слеши, то они должны обязательно быть в соответствующих местах в именах файлов. В других случаях символ «.» не рассматриваться как требующий специальной интерпретации.

Для ограничения множества имен файлов, соответствующих шаблону, может использоваться переменная GLOBIGNORE . Если переменная GLOBIGNORE установлена, то из списка соответствий удаляются все имена файлов, которые также соответствуют одному из шаблонов, указанных в переменной GLOBIGNORE . Однако настройка переменной GLOBIGNORE влияет на результаты сравнений, полученных при включенном параметре dotglob . Результатом будет то, что все другие имена файлов, начинающиеся с «.», будут считаться совпадающими. Чтобы добиться результата, когда имена файлов, начинающиеся с «.», будут игнорироваться, добавьте в переменную GLOBIGNORE шаблон «.*». Если значение переменной GLOBIGNORE не задано, параметр dotglob отключается.

Источник

Читайте также:  Doom 3 bfg linux
Оцените статью
Подстановки и разбиение на слова