Skip to main content

Todo sobre el comando de Linux / Unix: expr

expr command | Evaluate Expressions in Linux - FOTV (Abril 2025)

expr command | Evaluate Expressions in Linux - FOTV (Abril 2025)
Anonim

Nombre

expr - Evaluar una expresión

Sinopsis

expr arg ? arg arg … ?

Concatenados arg (agregando espacios de separación entre ellos), evalúa el resultado como una expresión Tcl y devuelve el valor. Los operadores permitidos en las expresiones Tcl son un subconjunto de los operadores permitidos en las expresiones C, y tienen el mismo significado y prioridad que los operadores C correspondientes. Las expresiones casi siempre producen resultados numéricos (valores enteros o de punto 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 admiten 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 usar el 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 es0), o en hexadecimal (si los dos primeros caracteres del operando son0x). Si un operando no tiene uno de los formatos enteros dados anteriormente, entonces se trata como un número de punto flotante si es posible. Los números de punto flotante pueden especificarse de cualquiera de las formas aceptadas por un compilador de C compatible con ANSI (excepto queF, F, lyL los sufijos no serán permitidos en la mayoría de las instalaciones). Por ejemplo, todos los siguientes son números válidos de punto flotante: 2.1, 3., 6e4, 7.91e + 16. Si no es posible una interpretación numérica, entonces se deja un operando como una cadena (y solo se le puede aplicar un conjunto limitado de operadores).

Los operandos pueden especificarse de cualquiera de las siguientes maneras:

1

Como valor numérico, entero o punto flotante.

2

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

3

Como una cadena encerrada entre comillas dobles. El analizador de expresiones realizará sustituciones de barra invertida, variable y comando en la información entre las comillas, y utilizará el valor resultante como el operando

4

Como una cuerda encerrada entre llaves. Los caracteres entre la llave abierta y la llave estrecha coincidente se utilizarán como operandos 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, comopecado ($ x). Vea a continuación una lista de funciones definidas.

Donde las sustituciones ocurren arriba (por ejemplo, dentro de las cadenas citadas), 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 llamar al procesador de expresiones. Como se explica a continuación, generalmente es mejor encerrar expresiones entre llaves para evitar que el analizador de comandos realice sustituciones en el contenido.

Para algunos ejemplos de expresiones simples, supongamos que la variableuna tiene el valor 3 y la variablesegundotiene el valor 6. Luego, el comando en el lado izquierdo de cada una de las líneas siguientes 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

Los operadores

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

- + ~ !

Unary menos, unary plus, bit -wise NO, lógico NO. Ninguno de estos operandos se puede aplicar a los operandos de cadena, y el bit NO se puede aplicar solo a los enteros.

* / %

Multiplica, divide, el resto. Ninguno de estos operandos se puede aplicar a los operandos de cadena, y el resto se puede aplicar solo a los enteros. El resto siempre tendrá el mismo signo que el divisor y un valor absoluto más pequeño que el divisor.

+ -

Sumar y restar. Válido para cualquier operandos numéricos.

<< >>

Cambio a izquierda y derecha. Válido solo para operandos enteros. Un cambio a la derecha siempre propaga el bit de signo.

< > <= >=

Booleano menor, mayor, menor o igual y mayor o igual. Cada operador produce 1 si la condición es verdadera, 0 de lo contrario. 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.

&

Poco a poco Y. Válido solo para operandos enteros.

^

OR exclusivo en cuanto a bits. Válido solo para operandos enteros.

|

Poco a poco OR. Válido solo para operandos enteros.

&&

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

||

OR lógico. Produce un resultado de 0 si ambos operandos son cero, de lo contrario 1. Válido solo para operandos booleanos y numéricos (enteros o de punto flotante).

X ? y : z

If-then-else, como en C. If X evalúa a no cero, entonces el resultado es el valor de y . De lo contrario, el resultado es el valor de z . los X El operando debe tener un valor numérico.

Consulte el manual de C para obtener 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&&, ||y?: los operadores tienen "evaluación perezosa", al igual que en C, lo que significa que los operandos no se evalúan si no son necesarios para determinar el resultado. Por ejemplo, en el comando

expr {$ v? a: b}

solo uno deuna osegundo En realidad será evaluado, dependiendo del valor de$ v. Sin embargo, tenga en cuenta que esto solo es cierto si la expresión completa está entre llaves; De lo contrario, el analizador Tcl evaluará tantouna ysegundo antes de invocar elexpr mando.

Funciones matematicas

Tcl soporta las siguientes funciones matemáticas en expresiones:

abdominales aporrearIniciar sesiónsqrt acos doblelog10srand como en exppowbronceado un bronceado pisorandTanh atan2 fmodredondo hacer techo hipopecado cos En tsinh

abdominales( arg )

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

acos arg )

Devuelve el arco coseno de arg , en el rango 0, pi radianes. Arg Debe estar en el rango -1,1.

como en( arg )

Devuelve el arco senoidal de arg , en el rango -pi / 2, pi / 2 radianes. Arg Debe estar en el rango -1,1.

un bronceado( 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 ambos no pueden ser 0.

hacer techo( arg )

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

cos arg )

Devuelve el coseno de arg , medido en radianes.

aporrear( arg )

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

doble( arg )

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

exp arg )

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

piso( arg )

Devuelve el mayor valor integral 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.

hipo x, y )

Calcula la longitud de la hipotenusa de un triángulo rectángulo ( X * X + y * y ).

En t( arg )

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

Iniciar sesión( arg )

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

log10 ( arg )

Devuelve el logaritmo de base 10 de arg . Arg Debe ser un valor positivo.

pow x, y )

Calcula el valor de X elevado al poder y . Si X es negativo, y debe ser un valor entero

rand ()

Devuelve un número de punto flotante de cero a apenas uno o, en términos matemáticos, el rango 0,1). La semilla proviene del reloj interno de la máquina o se puede configurar manualmente con la función srand.

redondo( arg )

Si arg es un valor entero, devuelve arg de lo contrario se convierte arg a entero por redondeo y devuelve el valor convertido.

pecado( arg )

Devuelve el seno de arg , medido en radianes.

sinh arg )

Devuelve el seno hiperbólico de arg . Si el resultado causara un desbordamiento, se devuelve un error.

sqrt arg )

Devuelve la raíz cuadrada de arg . Arg debe ser no negativo.

srand arg )

los arg , que debe ser un entero, se utiliza para restablecer la semilla para el generador de números aleatorios. Devuelve el primer número aleatorio de esa semilla. Cada intérprete tiene su propia semilla.

bronceado( arg )

Devuelve la tangente de arg , medido en radianes.

tanh arg )

Devuelve la tangente hiperbólica de arg .

Además de estas funciones predefinidas, las aplicaciones pueden definir funciones adicionales usandoTcl_CreateMathFunc().

Tipos, desbordamiento y precisión

Todos los cálculos internos que involucran números enteros se realizan con el tipo C largo y todos los cálculos internos que implican punto flotante se realizan con el tipo C doble . Cuando se convierte una cadena a punto flotante, se detecta un desbordamiento de exponente y produce un error Tcl. Para la conversión a un entero desde una cadena, la detección de desbordamiento depende del comportamiento de algunas rutinas en la biblioteca C local, por lo que debe considerarse como no confiable. En cualquier caso, el desbordamiento y el desbordamiento de enteros generalmente no se detectan de manera confiable para resultados intermedios. El desbordamiento y el desbordamiento de punto flotante se detectan en la medida en que el hardware lo admite, lo que generalmente es bastante confiable.

La conversión entre representaciones internas para los operandos de enteros, puntos flotantes y cadenas se realiza automáticamente según sea necesario. Para cálculos aritméticos, los enteros se usan hasta que se introduce algún número de punto flotante, después de lo cual se usa el punto flotante. Por ejemplo,

expr 5/4

devuelve 1, mientras

expr 5 / 4.0 expr 5 / (longitud de cadena "abcd" + 0.0)

ambos devuelven 1.25. Los valores de punto flotante siempre se devuelven con un ``.'' o unmi para que no se vean como valores enteros. Por ejemplo,

expr 20.0 / 5.0

devoluciones4.0no4.

Operaciones de cadena

Los valores de cadena se pueden usar como operandos de los operadores de comparación, aunque el evaluador de expresiones intenta hacer comparaciones como entero o punto flotante cuando puede. Si uno de los operandos de una comparación es una cadena y el otro tiene un valor numérico, el operando numérico se convierte de nuevo en una cadena utilizando la C sprintf especificador de formato%re para enteros y%sol para valores de punto flotante. Por ejemplo, los comandos.

expr {"0x03"> "2"} expr {"0y" <"0x12"}

ambos devuelven 1. La primera comparación se realiza utilizando la comparación de enteros, y la segunda se realiza utilizando la comparación de cadenas una vez que el segundo operando se convierte a la cadena18. Debido a la tendencia de Tcl a tratar los valores como números siempre que sea posible, generalmente no es una buena idea usar operadores como==cuando realmente quieres una comparación de cadenas y los valores de los operandos pueden ser arbitrarios; Es mejor en estos casos usar elcuerda comando en su lugar.

Consideraciones de rendimiento

Incluya expresiones entre llaves para obtener la mejor velocidad y los requisitos de almacenamiento más pequeños. Esto permite que el compilador de bytes de Tcl genere el mejor código.

Como se mencionó anteriormente, las expresiones se sustituyen dos veces: una vez por el analizador Tcl y una vez por el expr mando. Por ejemplo, los comandos.

establecer un 3 establecer b {$ a + 2} expr $ b * 4

devuelve 11, no un múltiplo de 4. Esto se debe a que el analizador Tcl primero sustituirá$ a + 2 para la variablesegundo, entonces elexpr comando evaluará la expresión$ a + 2 * 4.

La mayoría de las expresiones no requieren una segunda ronda de sustituciones. O bien están encerrados entre llaves o, si no, su variable y las sustituciones de comando producen números o cadenas que no requieren sustituciones. Sin embargo, debido a que algunas expresiones no marcadas necesitan dos rondas de sustituciones, el compilador de bytecode debe emitir instrucciones adicionales para manejar esta situación. El código más caro es necesario para las expresiones que no contengan corchetes que contengan sustituciones de comandos. Estas expresiones deben implementarse generando nuevo código cada vez que se ejecuta la expresión.

Palabras clave

aritmética, booleana, comparar, expresión, comparación difusa

Importante: Utilizar el hombre comando % hombre ) para ver cómo se usa un comando en su computadora en particular.