Переменные и присваивание значений

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

Чтобы значение переменной передавалась всем вызываемым командам, ее следует сделать передаваемой (экспортировать ее) командой «export» с именем переменной в качестве аргумента.

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

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

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

«Арифметические» и «логические» выражения

Выражения обычно вводятся в программу с использованием конструкции арифметического раскрытия выражений «$((выражение))». Заключенная в двойные круглые цепочка символов интерпретируется как арифметическое или логическое выражение, результат вычисления которого оболочкой подставляется на место вхождения этой конструкции в командной строке (Рис. 1‑72).

 

Рис. 1‑72

 

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

Выражение состоит из переменных, констант и знаков операций. Стандартом определены операции, перечисленные в таблице на Рис. 1‑73).

 

Рис. 1‑73

 

Знакомые с языком «Си» легко узнают в этом списке список стандартных операций этого языка за исключением унарных инкрементов и декрементов (префиксных и постфиксных), функции «sizeof()». В отличие от стандарта «Си», стандарт на язык оболочки требует определения этих операций лишь на длинных беззнаковых целых.

Поскольку руководства и справочники по «Си» общедоступны, разбирать операции подробно мы не будем. Они, в основном, соответствуют общепринятой математической и программистской нотации для выражений, за исключением представления символа равенства сочетанием «==», а не символом «=».

Чаще всего арифметическое раскрытие применяется в команде присваивания, но его можно использовать в любом месте (например, для задания числового операнда команды или числового параметра ключа) (Рис. 1‑74).

 

Рис. 1‑74

 

Помимо конструкции арифметического раскрытия, существует стандартная команда «expr», также вычисляющая значение выражения (с несколько иным синтаксисом, в частности, использующим для проверки на равенство знака «=»), переданного ей в качестве аргумента, и выводящая его результат. Выражение при этом следует экранировать двойными кавычками «"» и «"».

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

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