Подстановка переменных в оболочке 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 (нулем), если имя этого файла неизвестно.
$$ Заменяется (десятичным) номером процесса родительской оболочки.
$< Заменяется одной строкой из стандартного ввода без какой-либо обработки. Эта подстановка полезна в процедурах оболочки для чтения с клавиатуры.