В оболочке C можно выполнять подстановку значений переменных и имен файлов.
Создание и подстановка переменных в оболочке C описана в следующих разделах:
Оболочка C поддерживает набор переменных, каждая из которых хранит в качестве значения одно или несколько слов. Некоторые из этих переменных задаются оболочкой или используются ей. Например, переменная argv представляет собой список параметров среды, причем на слова, составляющие это значение, можно сослаться специальным образом.
Для изменения и просмотра значений переменных служат команды set и unset. Некоторые из переменных, используемых оболочкой, являются переключателями (включают и выключают какую-либо функцию). На работу оболочки влияет не их значение, а только тот факт, установлены они или нет. Например, переменная оболочки verbose - переключатель, включающий отображение выполняемых команд. Установка этой переменной приводит к добавлению в командную строку флага -v.
Другие переменные хранят численные значения. Например, команда @ присваивает переменной результат вычисления арифметического выражения. Однако значения переменных всегда представляются в виде некоторого количества строк. При численных расчетах пустая строка считается равной нулю; второе и последующие слова строки игнорируются.
При анализе команды оболочка разделяет строку ввода и выполняет подстановку псевдонимов. Затем, перед запуском команды, выполняется подстановка переменных. Подстановка выполняется при нахождении в строке символа $. Однако, если за этим символом следует пробел, знак табуляции или символ новой строки, то подстановка не выполняется. Указание перед знаком $ символа \ также отменяет подстановку. Предусмотрены следующие исключения:
Оболочка находит операторы перенаправления ввода и вывода перед подстановкой переменных, и обрабатывает их отдельно. Переменные в имени команды и списке аргументов подставляются вместе. Поэтому первое слово (команда) может быть заменено несколькими словами, первое из которых затем будет рассматриваться как имя команды, а остальные станут ее аргументами.
Если строка не заключена в " ", и не указан модификатор :q, результаты подстановки переменных могут затем быть переданы для подстановки имен файлов и команд. Если переменная, значение которой включает несколько слов, заключена в двойные кавычки, она заменяется одним словом или частью одного слова, исходные слова в котором разделены пробелами. Если указан модификатор :q, переменная заменяется несколькими словами. Все эти слова будут разделены пробелами и заключены в кавычки, чтобы предотвратить дальнейшую подстановку имен файлов и команд.
Значение переменной оболочки можно получить несколькими способами. Если не указано обратное, ссылка не переменную, не заданную явно командой set, приводит к ошибке.
К следующим подстановкам можно
применять модификаторы :gh, :gt,
:gr, :h, :r,
:q и :x. Если переменная указана в {
} (фигурных скобках), модификаторы должны находится внутри скобок.
Текущая реализация допускает только один модификатор : на
каждую подставляемую переменную.
Следующие подстановки не могут
быть изменены модификаторами : (двоеточие):
Оболочка C содержит несколько функций для сокращения вводимых команд. Если слово содержит символы *, ?, [ ] или { }, или начинается с тильды (~), для этого слова будет применяться подстановка имен файлов. Оболочка C рассматривает это слово как шаблон и заменяет его списком имен файлов, соответствующих этому шаблону, отсортированных по алфавиту.
При этом применяется текущий порядок сортировки, заданный переменными среды LC_COLLATE и LANG. Если ни один из указанных шаблонов не соответствует ни одному из существующих файлов, возникает ошибка. Однако существование файлов для каждого из шаблонов не требуется. Подстановку по шаблону или расширение файла обозначают только символы подстановки *, ? и [ ]. Для указания сокращений в именах файлов применяются символы ~ (тильда) и { } (фигурные скобки).
Символ * соответствует любой подстроке символов, в том числе и пустой. Например, в каталоге с файлами:
a aa aax alice b bb c cc
команда echo a* напечатает имена всех файлов, начинающихся с a:
a aa aax alice
Примечание: При сравнении имени файла с шаблоном символы точка (.) и / должны сопоставляться явно.
Символ ? соответствует любому одному символу. Команда
ls a?x
покажет все состоящие из трех букв имена файлов, начинающиеся с a, и оканчивающиеся на x:
aax
Для нахождения символов из определенного набора перечислите эти символы в [ ] (квадратных скобках). Команда
ls [abc]
покажет все файлы, имена которых равны одному из следующих символов:
a b c
Весь алфавит в квадратных скобках можно указать следующим образом: [a-z]. Символы, соответствующие этому шаблону, определяются текущим порядком сортировки.
Для указания сокращений в именах файлов применяются символы ~ (тильда) и { } (фигурные скобки). Символ ~ в начале имени файла заменяется именем домашнего каталога. Отдельно стоящий символ ~ заменяется именем текущего домашнего каталога, которое берется из переменной оболочки home. Например, команда:
ls ~
Покажет все файлы и подкаталоги каталога $HOME
Если за символом ~ (тильда) следует имя, состоящее из букв, цифр и символов - , оболочка подставляет каталог $HOME пользователя с таким именем.
Примечание: Если после ~ (тильды) стоит символ, отличный от буквы и / (косой черты), или тильда указана не в начале слова, подстановка не выполняется.
Для подстановки в имя файла нескольких различных слов укажите их в { } (фигурных скобках). Например, a{b,c,d}e будет заменено на abe ace ade. Порядок слов при этом сохраняется. Подобная конструкция может быть вложенной. Таким образом, выражение:
~source/s1/{oldls,ls}.c
/usr/source/s1/oldls.c /usr/source/s1/ls.c
если домашний каталог для source равен /usr/source. Аналогично
../{memo,*box}
../memo ../box ../mbox
Примечание:memo не сортируется вместе с результатами подстановки слова *box. В некоторых случаях символы { , } и { } не заменяются.
Для указания диапазонов символов можно также применять классы:
[:класс_символов:]
Данный формат обозначает любой
символ, принадлежащий указанному классу. Набор классов соответствует
функциям ctype.
Предположим, что текущий каталог содержит следующие файлы:
a aa aax Alice b bb c cc
Введите в командной строке оболочки C следующую команду:
ls [:lower:]
Нажмите Enter.
Оболочка C покажет все имена файлов, начинающиеся со строчных букв:
a aa aax b bb c cc
Дополнительная информация о выражениях с классами символов приведена в описании команды ed.