Una guía para entender el comando Linux/Unix: expr


Nombre

expr – Evalúa una expresión

Sinopsis

expr arg ? arg arg …?

Concatenates arg‘s (añadiendo espacios separadores entre ellos), evalúa el resultado como una expresión Tcl, y devuelve el valor. Los operadores permitidos en expresiones Tcl son un subconjunto de los operadores permitidos en expresiones C, y tienen el mismo significado y precedencia que los operadores C correspondientes. Las expresiones casi siempre producen resultados numéricos (valores enteros o en coma flotante). Por ejemplo, la expresión

 expr 8.2 + 6

se evalúa a 14,2. Las expresiones Tcl difieren de las expresiones C en la forma en que se especifican los operandos. Además, las expresiones Tcl soportan operandos no numéricos y comparaciones de cadenas.

Operandos

Una expresión Tcl consiste en una combinación de operandos, operadores y paréntesis. Se puede utilizar un espacio en blanco entre los operandos y los operadores y los paréntesis; es ignorado por las instrucciones de la expresión. Cuando es posible, los operandos se interpretan como valores enteros. Los valores enteros se pueden especificar en decimal (el caso normal), en octal (si el primer carácter del operando es 0 ), o en hexadecimal (si los dos primeros caracteres del operando son 0x ). Si un operando no tiene uno de los formatos de números enteros dados arriba, entonces se trata como un número de punto flotante si esto es posible. Los números de coma flotante pueden especificarse de cualquiera de las formas aceptadas por un compilador de C que cumpla con ANSI (excepto que los sufijos f , F , l , , L , y L no se permitirán en la mayoría de las instalaciones). Por ejemplo, todos los siguientes son números de punto flotante válidos: 2.1, 3., 6e4, 7.91e+16. Si no es posible una interpretación numérica, entonces un operando queda como una cadena (y sólo se le puede aplicar un conjunto limitado de operadores).

Los operandos pueden especificarse de cualquiera de las siguientes maneras:

1]

Como un valor numérico, ya sea entero o en coma flotante.

2]

Como una variable Tcl, usando notación estándar $ . El valor de la variable se utilizará como operando.

3]

Como una cadena encerrada entre comillas dobles. El analizador de expresiones realizará sustituciones de barras invertidas, variables y comandos en la información entre las comillas, y utilizará el valor resultante como operando

.

4]

Como un cordón encerrado en frenillos. Los caracteres entre la férula abierta y la férula cerrada correspondiente se utilizarán como operando sin ninguna sustitución.

5]

Como un comando Tcl encerrado entre paréntesis. El comando se ejecutará y su resultado se utilizará como operando.

6]

Como una función matemática cuyos argumentos tienen cualquiera de las formas anteriores para operandos, como sin($x) . Consulte a continuación una lista de funciones definidas.

Cuando las sustituciones ocurren arriba (por ejemplo, dentro de las cadenas entre comillas), se realizan mediante las instrucciones de la expresión. Sin embargo, es posible que el analizador de comandos ya haya realizado una capa adicional de sustitución antes de que se llamara al procesador de expresiones. Como se explica más adelante, normalmente es mejor encerrar las expresiones con llaves para evitar que el analizador de comandos realice sustituciones en el contenido.

Para algunos ejemplos de expresiones simples, supongamos que la variable a tiene el valor 3 y la variable b tiene el valor 6. Entonces el comando en el lado izquierdo de cada una de las líneas de abajo producirá el valor en el lado derecho de la línea:

 expr 3.1 + $a6.1 
expr 2 + "$a.$b "5.6
expr 4*[longitud "6 2"]8
expr {{word one} < "word $a"}0

Operadores

Los operadores válidos se enumeran a continuación, agrupados en orden decreciente de precedencia:

- + ~ ~!

Unary minus, unary plus, bit-wise NOT, logical NOT. Ninguno de estos operandos puede aplicarse a los operandos de cadena, y NO a los operandos de bit sólo a los enteros.

* / %

Multiplicar, dividir, resto. Ninguno de estos operandos puede aplicarse a operandos de cadena, y el resto puede aplicarse sólo a números enteros. El resto siempre tendrá el mismo signo que el divisor y un valor absoluto menor que el divisor.

+ -

Sumar y restar. Válido para cualquier operando numérico.

Desplazamiento a izquierda y derecha. Válido sólo para operandos enteros. Un desplazamiento a la derecha siempre propaga el bit de señal.

<= =

Booleano menos, mayor, menor o igual, y mayor o igual. Cada operador produce 1 si la condición es verdadera, 0 si no. Estos operadores pueden aplicarse tanto a cadenas como a operandos numéricos, en cuyo caso se utiliza la comparación de cadenas.

== !=

Booleano igual y no igual. Cada operador produce un resultado de cero/uno. Válido para todos los tipos de operandos.

&

Y en lo que respecta a los bits. Válido sólo para operandos enteros.

^

En cuanto a los bits, el quirófano es exclusivo. Válido sólo para operandos enteros.

|

Un poco más en el quirófano. Válido sólo para operandos enteros.

&&

Y lógico. Produce un resultado de 1 si ambos operandos son distintos de cero, 0 en caso contrario. Válido sólo para operandos booleanos y numéricos (enteros o en coma flotante).

|||

Un quirófano lógico. Produce un resultado 0 si ambos operandos son cero, 1 en caso contrario. Válido sólo para operandos booleanos y numéricos (enteros o en coma flotante).

x ? y : z

Si x se evalúa a distinto de cero, entonces el resultado es el valor de y. De lo contrario, el resultado es el valor de z. El operando x debe tener un valor numérico.

Consulte el manual C para más detalles sobre los resultados producidos por cada operador. Todos los operadores binarios se agrupan de izquierda a derecha dentro del mismo nivel de precedencia. Por ejemplo, el comando

 expr 4*2 < 7

devuelve 0.

Los operadores & , || , y ?: tienen ``evaluación enzimática'', como en C, lo que significa que los operandos no son evaluados si no son necesarios para determinar el resultado. Por ejemplo, en el comando

 expr {$v ?[a] :[b]}

sólo uno de [a] o [b] será evaluado, dependiendo del valor de $v . Tenga en cuenta, sin embargo, que esto sólo es cierto si toda la expresión está encerrada entre llaves; de lo contrario, el analizador Tcl evaluará tanto [a] como [b] antes de invocar el comando expr .

Funciones matemáticas

Tcl soporta las siguientes funciones matemáticas en expresiones:

 abs coshlogsqrt 
acos doublelog10srand
asin exppowtan
atan floorrandtanh
atan2 fmodround
ceil hypotsin
cos intsinh

abs( arg )

Devuelve el valor absoluto de arg. Arg puede ser entero o en coma flotante, y el resultado se devuelve de la misma forma.

acos( arg )

Devuelve el coseno del arco de arg, en el rango[0,pi] radianes. Arg debería estar en el rango[-1,1].

asin( arg )

Devuelve el seno de arco de arg, en el rango[-pi/2,pi/2] radianes. Arg debería estar en el rango[-1,1].

atan( arg )

Devuelve el arco tangente de arg, en el rango[-pi/2,pi/2] radianes.

atan2( x, y )

Devuelve el arco tangente de y/ x, en el rango[-pi,pi] radianes. x y y no pueden ser ambos 0.

ceil( arg )

Devuelve el valor entero más pequeño no menos que arg.

cos( arg )

Devuelve el coseno de arg, medido en radianes.

cosh( arg )

Devuelve el coseno hiperbólico de arg. Si el resultado causaría un desbordamiento, se devuelve un error.

doble( arg )

Si arg es un valor flotante, devuelve arg, de lo contrario convierte arg a flotante y devuelve el valor convertido.

exp( arg )

Devuelve el exponencial de arg, definido como e** arg. Si el resultado causaría un desbordamiento, se devuelve un error.

floor( arg )

Devuelve el valor integral mayor no mayor que arg.

fmod( x, y )

Devuelve el resto en coma flotante de la división de x por y. Si y es 0, se devuelve un error.

hypot( x, y )

Calcula la longitud de la hipotenusa de un triángulo en ángulo recto ( x* x+ y* y).

int( arg )

Si arg es un valor entero, devuelve arg, de lo contrario convierte arg en entero por truncamiento y devuelve el valor convertido.

log( arg )

Devuelve el logaritmo natural de arg. Arg debe ser un valor positivo.

log10( arg )

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *