Variable substitution

Сейчас продолжим тему интеграции. Сейчас разговариваем о том, что шелл явл. оболочкой, которая интегрирует другие утилиты. В прошлый раз говорили про перенаправление, что в юнихе существует класс объектов под названием канал, и перенаправление --- открытие канала, и одной программе в качестве стандартного вывода предл. одна сторона канала, другой в качестве стдин --- другая сторона. Мы поговарили про перенаправление ввода/вывода. Почему лектор настаивает на том, что этностися к части интегр.: есть много команд, которые занимаются обработкой и генер. текста, и надо это организовывать, и это перенапр. есть способ огр.

Продолжит лектор с темы окружение. Когда говорят про юнуксовые тексты, то там есть термин окружение. Что входит в понятие окружение: * Дескрипторы открытых файлов * Переменные окружения * ID Группы процессов, PID, UID, ... --- идентификаторы Дело втом, что при порождении нового процесса в юниксе исп. два сис. вызова, форк и экзек, и оба вызова сохраняют окружение процесса. Это самое окружение --- эффективное средство упр. самим процессом. Какие способы модиф. поведения: параметры командной строки, конфиг-файлы, ... что делать программам среднего размера? с одной стороны, параметров конфигурации много, с другой --- конфиг излишен. Те модификаторы, которые хотите исправить, надо хранить в переменных. Переменные --- очень простая штука, у них есть имя, есть значение, строковые. Некоторые переменные окружения (практически все) являются управляющими. Например, PATH --- в нём хранится список каталогов, в которых лежат исполняемые файлы. Разумеется, очень удобно, что эта переменная окр. наследуется. Другой пример --- TTY, указывает то устройство, которое устройство вывода. Или EDITOR --- путь к редактору.... Их там довольно много, если сказать set, то можно увидить много переменных и не только Есть переменные, можно просто сказать var = QQ, и если её добавить в окружение командой export, то она помещается в окружение, которое наследуется.

Ради чего затеян сегодняшний разговор: ради понятия подстановки. В скриптовых языках программирования часто, для того, чтобы обеспечить более лёгкий синт. разбор, переменные предваряются долларом: echo $Var. Оно же взятие значения (подстановка значения) переменной. Это краткая форма, более полная: ${Var}. Но, помимо того, что такая подстановка значения происходит, с этим значением можно много чего поделать. Первое: подстановка через двоеточие ${v:[-=?+]word} первое --- если переменная пустая, то подставится word, второе --- то же самое, что с минусом, только переменной ещё присвоится значение, вопросительный знак --- если не определена, то произойдёт ошибка, и выведится текст, последнее --- если переменная есть, то будет использовать word. Это первый тип подстановок, который позволяет поплясать относительно определённости. Второй класс --- преобразование содержимого прееменной. ${#v} --- длина строки, содерж. символ. Ещё --- отрезание префикса и суффикса ${v%суффикс} --- отрезает минимальное, соотв. шаблону. {v%%суффикс} --- ототризание максимального суффикса. #, ## --- префиксы. Может быть не все знают, что это всё встроено в стандарт, а самое нужное и частое --- замено одного символа на другое нету.

Это всё к чему: подстановка знач. перем. подвергается некоей обработке. Более серьёзная обработка не предусмотрена. В баше/зыше предусмотрено большое количество флагов, и там чего только нельзя сделать: отрезать кусок опр. длины, превратить число из незвестно скольки цифр, в число фикс. длины. В зыше этому посвящено неск. страниц. Единственное, что непонятно --- зачем это нужно, если в перле оно не работает.

Каким образом сделать что-то развесистое, пользуясь стандартом, этот способ тоже называется substitutuion: $(команда)', команда, тут выполняется команда и результат подставляется вместо. В ЯП этого не увидите, эта команда нацелена на интеграцию. Фактически, если надо преобразовать строку, то вызвать команду, например, sed или tr. Например: New = $(echo "$v" | tr '[A-Z]' '*'). (рассказ про экранирование)

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

Ещё подстановкой называется арифметические подстановки. Не все знают, что арифм. подст. входят в посих. В частности, $((строка)), где вычисляются целочисленные выражения. Короче говоря, результат такой подстановки --- вычисленное выражение, содерж. в строке. Особенности новых шеллов, коотрые могут позволить сделать следующее: $((A+B)) --- так в стандарте делать нельзя, надо $(($A + $B)).

Есть две вещи, называемые подстановками.

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

Докончим про шаблоны. Там ещё две вещи: в каком порядке применяются подстановки, и шаблоны.

Шаблоны. Ничего сложного нет, есть волшебный символ *, которые заменяется на все символы. Что такое шаблон: шаблон --- группа спец. символов, которые могут соотв. цепочкам символов. Эта группа символов исп. для того, чтобы сопост. с имеющ. шаблонов. Цепочка может подходить, или не подходить. Поставление шаблонов может быть разное, чаще всего используются регэкспы. В шелле используется более простой синтаксис. Шаблон, соотв. звёздочке, соотв. любой цепочке символов. Одиночный шаблон вопр. знак соотв. одному символу. Диапазон [символ1символ2символ3-символ4] соотв. одному символу из этого множества. С этим надо быть максимально осторожным, потому что порядок символов зависит от локали. Есть ещё [^...] --- символ не из диапазона. Шаблон, сост неспец. символу, соотв ему. Если встречается составной шаблон ... Шаблоны активно исп. шеллом для filename generation. В ком. стр. можно указывать вместо имени файла шаблон. Дело в том, что ... шелл попытается составить список файлов и превратит шаблон в список файлов. Если написать echo a*, то echo на вход подастся список файлов на букву a. fng происходит перед тем, как передаются параметры. С этим связан тот факт, что rm * не знает, что ей сказали звёздочку, она считает, что ей дали список файлов. Если шаблоны не экранировать, то они будут преобразованы. В FNG не входит слеш и файлы, начинающиеся с точки. Можно вообще отключить FNG.

Ещё одно: что будет, если ни одного файла на а не начинается. Первая линия поведения: выдать ошибку. Вторая --- не преобразовывать. По стандарту --- ошибка.

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


Сведения о ресурсах

Готовность (%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

0

1

1

1

1

MaximByshevskiKonopko, DmitryChistikov, MaximByshevskiKonopko


CategoryLectures CategoryCmc CategoryUneex

LecturesCMC/LinuxShell2008/04/02VariableSubstitution (последним исправлял пользователь eSyr 2008-07-25 01:12:31)