[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]

Руководство пользователя: Операционная система и устройства


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

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

Создание и подстановка переменных в оболочке C описана в следующих разделах:

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

Оболочка C поддерживает набор переменных, каждая из которых хранит в качестве значения одно или несколько слов. Некоторые из этих переменных задаются оболочкой или используются ей. Например, переменная argv представляет собой список параметров среды, причем на слова, составляющие это значение, можно сослаться специальным образом.

Для изменения и просмотра значений переменных служат команды set и unset. Некоторые из переменных, используемых оболочкой, являются переключателями (включают и выключают какую-либо функцию). На работу оболочки влияет не их значение, а только тот факт, установлены они или нет. Например, переменная оболочки verbose - переключатель, включающий отображение выполняемых команд. Установка этой переменной приводит к добавлению в командную строку флага -v.

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

При анализе команды оболочка разделяет строку ввода и выполняет подстановку псевдонимов. Затем, перед запуском команды, выполняется подстановка переменных. Подстановка выполняется при нахождении в строке символа $. Однако, если за этим символом следует пробел, знак табуляции или символ новой строки, то подстановка не выполняется. Указание перед знаком $ символа \ также отменяет подстановку. Предусмотрены следующие исключения:

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

Если строка не заключена в " ", и не указан модификатор :q, результаты подстановки переменных могут затем быть переданы для подстановки имен файлов и команд. Если переменная, значение которой включает несколько слов, заключена в двойные кавычки, она заменяется одним словом или частью одного слова, исходные слова в котором разделены пробелами. Если указан модификатор :q, переменная заменяется несколькими словами. Все эти слова будут разделены пробелами и заключены в кавычки, чтобы предотвратить дальнейшую подстановку имен файлов и команд.

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

К следующим подстановкам можно применять модификаторы :gh, :gt, :gr, :h, :r, :q и :x. Если переменная указана в { } (фигурных скобках), модификаторы должны находится внутри скобок. Текущая реализация допускает только один модификатор : на каждую подставляемую переменную.

$Имя   
${Имя} Будет заменено значением переменной Имя, слова в котором будут разделены пробелами. Фигурные скобки отделяют параметр Имя от следующих символов. Имена переменных оболочки должны начинаться с буквы и включать до 20 букв, цифр и символов подчеркивание (_). Если переменной оболочки Имя не существует, но есть такая переменная среды, подставляется ее значение. Модификаторы, указываемые после двоеточия, в данном случае недопустимы.
$Имя[Номер  
${Имя[Номер]} Выбирает только некоторые из слов, составляющих значение переменной Имя. Номер также может быть объектом для подстановки; в нем может быть указано одно или два числа, разделенные символом - . Первое слово значения переменной имеет номер 1. Если первое число опущено, по умолчанию оно считается равным 1. Если последнее число опущено, результат эквивалентен подстановке вместо него значения $#Имя. Символ * выбирает все слова. Пустой результат, если второй аргумент указан в допустимом диапазоне или вовсе не указан, не приводит к ошибке.
$#Имя  
${#Имя} Заменяется числом слов в переменной Имя. Это значение полезно при подстановке [Номера] в предыдущей нотации. Пример: $Имя[$#Имя].
$0 Заменяется именем файла, из которого прочитан ввод команды. Если имя неизвестно, выдается сообщение об ошибке.
$Номер   
${Номер} Эквивалентно $argv[Номер].
$* Эквивалентно $argv[*].

Следующие подстановки не могут быть изменены модификаторами : (двоеточие):

$?Имя   
${?Имя} Заменяется 1 (единицей), если переменная Имя установлена, и 0 (нулем), если переменная не установлена.
$?0 Заменяется 1 (единицей), если имя текущего файла ввода известно, и 0 (нулем), если имя этого файла неизвестно.
$$ Заменяется (десятичным) номером процесса родительской оболочки.
$< Заменяется одной строкой из стандартного ввода без какой-либо обработки. Эта подстановка полезна в процедурах оболочки для чтения с клавиатуры.

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

Оболочка 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.

Класс символов Определение
alnum Алфавитно-цифровые символы
alpha Строчные и прописные буквы
cntrl Управляющие символы
digit Цифры
graph Графические символы
lower Строчные буквы
print Печатаемые символы
punct Знаки препинания
space Пробел, горизонтальная табуляция, перевод строки, вертикальная табуляция, перевод страницы
upper Прописные символы
xdigit Шестнадцатиричные цифры

Предположим, что текущий каталог содержит следующие файлы:

a aa aax Alice b bb c cc

Введите в командной строке оболочки C следующую команду:

     ls [:lower:]

Нажмите Enter.

Оболочка C покажет все имена файлов, начинающиеся со строчных букв:

a aa aax b bb c cc

Дополнительная информация о выражениях с классами символов приведена в описании команды ed.


[ Страница назад | Страница вперед | Содержание | Индекс | Домой | Юридическая информация | Поиск ]