Все о команде Linux / Unix: expr
В expr полезность для Linux оболочка объединяет аргументы, а затем оценивает результат как выражение Tcl, возвращая значение в стандартный вывод.
Операторы, разрешенные в выражениях Tcl, являются подмножеством операторов, разрешенных в выражениях C, и имеют то же значение и приоритет, что и соответствующие операторы C. Выражения почти всегда давать числовые результаты (целые числа или значения с плавающей запятой).
Синопсис
Команда принимает следующий общий вид:
выражение arg1 arg2 ...
Операнды
Выражение Tcl состоит из комбинации операндов, операторов и скобок. Между операндами, операторами и скобками можно использовать пробелы; оно игнорируется инструкциями выражения.
По возможности операнды интерпретируются как целые числа. Целочисленные значения могут быть указаны в десятичном (нормальный случай), в восьмеричном (если первым символом операнда является 0) или в шестнадцатеричном (если первые два символа операнда 0x). Если операнд не имеет одного из целочисленных форматов, указанных выше, то он обрабатывается как число с плавающей запятой, если это возможно.
Числа с плавающей запятой могут быть указаны любым из способов, принятых ANSI-совместимым компилятором C (за исключением того, что ж, F, л, а также L суффиксы не разрешены в большинстве установок). Например, все следующие допустимые числа с плавающей запятой: 2.1, 3., 6e4, 7.91e + 16. Если числовая интерпретация невозможна, то операнд остается в виде строки, и к ней может применяться только ограниченный набор операторов.
Операнды могут быть указаны любым из следующих способов:
- Как числовое значение, целое или с плавающей запятой.
- В качестве переменной Tcl, используя стандартные $ обозначение. Значение переменной будет использоваться в качестве операнда.
- В виде строки, заключенной в двойные кавычки. Синтаксический анализатор выражений будет выполнять обратную косую черту, замену переменных и команд для информации, заключенной в кавычки, и использовать полученное значение в качестве операнда.
- В виде строки, заключенной в фигурные скобки. Символы между открытой фигурной скобкой и соответствующей закрывающей скобкой будут использоваться в качестве операнда без каких-либо замен.
- Как команда Tcl, заключенная в квадратные скобки. Команда будет выполнена, и ее результат будет использован в качестве операнда.
- Как математическая функция, аргументы которой имеют любую из указанных выше форм для операндов, например грех ($ x).
Если замены происходят выше (например, внутри строк в кавычках), они выполняются инструкциями выражения. Однако дополнительный уровень подстановки мог уже быть выполнен синтаксическим анализатором команд до вызова процессора выражений.
Для некоторых примеров простых выражений предположим, что переменная а имеет значение 3 и переменная б имеет значение 6. Затем команда в левой части каждой из строк ниже выдаст значение в правой части строки:
expr 3.1 + $ a6.1
expr 2 + "$ a. $ b" 5.6
выражение 4 * [длина "6 2"] 8
expr {{word one}
Операторы
Допустимые операторы перечислены ниже, сгруппированные в порядке убывания приоритета:
- - + ~ !: Унарный минус, унарный плюс, побитовое НЕ, логическое НЕ. Ни один из этих операндов не может применяться к строковым операндам, а побитовое НЕ может применяться только к целым числам.
- * / %: Умножение, деление, остаток. Ни один из этих операндов не может применяться к строковым операндам, а остаток может применяться только к целым числам. У остатка всегда будет тот же знак, что и у делителя, и абсолютное значение меньше, чем у делителя.
- + -: Сложить и вычесть. Действительно для любых числовых операндов.
- << >>: Сдвиг влево и вправо. Действительно только для целочисленных операндов. При сдвиге вправо всегда передается знаковый бит.
- < > <= >=: Логическое значение меньше, больше, меньше или равно и больше или равно. Каждый оператор выдает 1, если условие истинно, и 0 в противном случае. Эти операторы могут применяться как к строкам, так и к числовым операндам, и в этом случае используется сравнение строк.
- == !=: Логическое значение равно и не равно. Каждый оператор дает результат ноль / один. Действительно для всех типов операндов.
- &: Побитовое И. Действительно только для целочисленных операндов.
- ^: Побитовое исключающее ИЛИ. Действительно только для целочисленных операндов.
- |: Побитовое ИЛИ. Действительно только для целочисленных операндов.
- &&: Логическое И. Дает результат 1, если оба операнда не равны нулю, в противном случае - 0. Действительно только для логических и числовых (целых или с плавающей запятой) операндов.
- ||: Логическое ИЛИ. Дает результат 0, если оба операнда равны нулю, в противном случае - 1. Действительно только для логических и числовых (целых или с плавающей запятой) операндов.
- Икс?у:z: If-then-else, как в C. Если Икс оценивается как ненулевое, тогда результатом является значение у. В противном случае результатом будет значение z. В Икс операнд должен иметь числовое значение.
См. Руководство по C для получения более подробной информации о результатах, полученных каждым оператором. Все бинарные операторы группировать слева направо с одним и тем же уровнем приоритета. Например, команда.
выражение 4 * 2 <7
возвращает 0.
В &&, ||, а также ?: Операторы имеют `` ленивую оценку '', как и в C, что означает, что операнды не оцениваются, если они не нужны для определения результата. Например, в команда
expr {$ v? [a]: [b]}
только один из [а] или [b] будет фактически оценен, в зависимости от значения $ v. Обратите внимание, однако, что это верно только в том случае, если все выражение заключено в фигурные скобки; в противном случае парсер Tcl оценит как [а] а также [b] перед вызовом expr команда.
Математические функции
Tcl поддерживает в выражениях следующие математические функции:
- абс (аргумент): Возвращает абсолютное значение аргумент. Arg может быть целым или с плавающей запятой, и результат возвращается в той же форме.
- acos (аргумент): Возвращает арккосинус аргумент, в диапазоне [0, пи] радиан. Arg должен быть в диапазоне [-1,1].
- как в(аргумент): Возвращает арксинус аргумент, в диапазоне [-pi / 2, pi / 2] радиан. Arg должен быть в диапазоне [-1,1].
- загар(аргумент): Возвращает арктангенс аргумент, в диапазоне [-pi / 2, pi / 2] радиан.
- atan2 (х, у): Возвращает арктангенс у/Икс, в диапазоне [-pi, pi] радиан. Икс а также у не могут оба быть 0.
- ceil (аргумент): Возвращает наименьшее целочисленное значение не менее аргумент.
- cos (аргумент): Возвращает косинус аргумент, измеряется в радианах.
- сш (аргумент): Возвращает гиперболический косинус аргумент. Если результат вызовет переполнение, возвращается ошибка.
- двойной(аргумент): Если аргумент является плавающим значением, возвращает аргумент, иначе преобразует аргумент в плавающее и возвращает преобразованное значение.
- ехр (аргумент): Возвращает экспоненту аргумент, определяемый как e **аргумент. Если результат вызовет переполнение, возвращается ошибка.
- пол(аргумент): Возвращает наибольшее целое значение, не превышающее аргумент.
- fmod (х, у): Возвращает остаток от деления числа с плавающей запятой. Икс к у. Если у равно 0, возвращается ошибка.
- гипотеза (х, у): Вычисляет длину гипотенузы прямоугольного треугольника (Икс*Икс+у*у).
- int (аргумент): Если аргумент является целочисленным значением, возвращает аргумент, иначе преобразует аргумент в целое число путем усечения и возвращает преобразованное значение.
- бревно(аргумент): Возвращает натуральный логарифм от аргумент. Arg должно быть положительным значением.
- log10 (аргумент): Возвращает десятичный логарифм от аргумент. Arg должно быть положительным значением.
- пау (х, у): Вычисляет значение Икс возведен к власти у. Если Икс отрицательный, у должно быть целым числом.
- rand (): Возвращает число с плавающей запятой от нуля до меньше единицы или, говоря математическим языком, в диапазоне [0,1). Посевной материал поступает от внутренних часов машины или может быть настроен вручную с помощью функции srand.
- круглый(аргумент): Если аргумент является целочисленным значением, возвращает аргумент, иначе преобразует аргумент в целое число путем округления и возвращает преобразованное значение.
- грех (аргумент): Возвращает синус аргумент, измеряется в радианах.
- sinh (аргумент): Возвращает гиперболический синус аргумент. Если результат вызовет переполнение, возвращается ошибка.
- sqrt (аргумент): Возвращает квадратный корень из аргумент. Arg должно быть неотрицательным.
- srand (аргумент): The аргумент, которое должно быть целым числом, используется для сброса начального числа для генератора случайных чисел. Возвращает первое случайное число из этого начального числа. У каждого интерпретатора есть свое семя.
- загар (аргумент): Возвращает тангенс аргумент, измеряется в радианах.
- танх (аргумент): Возвращает гиперболический тангенс аргумент.
В дополнение к этим предопределенным функциям приложения могут определять дополнительные функции, используя Tcl_CreateMathFunc().
Типы, переполнение и точность
Все внутренние вычисления с использованием целых чисел выполняются с типом C длинный, и все внутренние вычисления с плавающей запятой выполняются с типом C двойной. При преобразовании строки в числа с плавающей запятой обнаруживается переполнение экспоненты, что приводит к ошибке Tcl. Для преобразования в целое число из строки обнаружение переполнения зависит от поведения некоторых подпрограмм в локальной библиотеке C, поэтому его следует рассматривать как ненадежный. В любом случае целочисленное переполнение и потеря значимости обычно не обнаруживаются надежно для промежуточных результатов. Переполнение и недостаточное заполнение с плавающей запятой обнаруживаются в той степени, которая поддерживается аппаратным обеспечением, что, как правило, довольно надежно.
Преобразование между внутренними представлениями для целочисленных, с плавающей запятой и строковых операндов выполняется автоматически по мере необходимости. Для арифметических вычислений целые числа используются до тех пор, пока не будет введено какое-либо число с плавающей запятой, после чего используется число с плавающей запятой. Например,
expr 5/4
возвращает 1, а.
выражение 5 / 4.0
expr 5 / ([длина строки «abcd»] + 0,0)
оба возвращают 1,25. Значения с плавающей запятой всегда возвращаются с символом ''.'' или е так что они не будут выглядеть как целые числа. Например,
выражение 20.0 / 5.0
возвращается 4.0, нет 4.
Строковые операции
Строковые значения могут использоваться в качестве операндов операторов сравнения, хотя оценщик выражений пытается выполнять сравнения как целые числа или числа с плавающей запятой, когда это возможно. Если один из операндов сравнения является строкой, а другой имеет числовое значение, числовой операнд преобразуется обратно в строку с использованием C спринт спецификатор формата % d для целых чисел и %грамм для значений с плавающей запятой. Например, команды:
выражение {"0x03"> "2"}
expr {"0y"
оба возвращают 1. Первое сравнение выполняется с использованием целочисленного сравнения, а второе - с использованием сравнения строк после преобразования второго операнда в строку 18. Из-за тенденции Tcl по возможности обрабатывать значения как числа, обычно не рекомендуется использовать такие операторы, как == когда вам действительно нужно сравнение строк и значения операндов могут быть произвольными; в этих случаях лучше использовать нить вместо этого.