Skip to main content

Tudo sobre o comando Linux / Unix: expr

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

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

Nome

expr - Avalie uma expressão

Sinopse

expr arg ? arg arg … ?

Concatena arg (adicionando espaços de separação entre eles), avalia o resultado como uma expressão Tcl e retorna o valor. Os operadores permitidos em expressões Tcl são um subconjunto dos operadores permitidos em expressões C e têm o mesmo significado e precedência que os operadores C correspondentes. As expressões quase sempre geram resultados numéricos (valores inteiros ou de ponto flutuante). Por exemplo, a expressão

expr 8,2 + 6

avalia para 14.2. As expressões Tcl diferem das expressões C no modo como os operandos são especificados. Além disso, as expressões Tcl suportam operandos não numéricos e comparações de strings.

Operandos

Uma expressão Tcl consiste em uma combinação de operandos, operadores e parênteses. Espaço em branco pode ser usado entre os operandos e operadores e parênteses; é ignorado pelas instruções da expressão. Sempre que possível, os operandos são interpretados como valores inteiros. Valores inteiros podem ser especificados em decimal (o caso normal), em octal (se o primeiro caractere do operando for0), ou em hexadecimal (se os dois primeiros caracteres do operando forem0x). Se um operando não tiver um dos formatos inteiros fornecidos acima, ele será tratado como um número de ponto flutuante, se isso for possível. Os números de ponto flutuante podem ser especificados em qualquer uma das formas aceitas por um compilador C compatível com ANSI (exceto que of, F, eueeu sufixos não serão permitidos na maioria das instalações). Por exemplo, todos os itens a seguir são números de ponto flutuante válidos: 2.1, 3., 6e4, 7.91e + 16. Se nenhuma interpretação numérica for possível, então um operando é deixado como uma string (e somente um conjunto limitado de operadores pode ser aplicado a ele).

Operandos podem ser especificados de uma das seguintes maneiras:

1

Como um valor numérico, seja inteiro ou ponto flutuante.

2

Como uma variável Tcl, usando padrão$ notação. O valor da variável será usado como o operando.

3

Como uma string entre aspas duplas. O analisador de expressão executará substituições de barras invertidas, variáveis ​​e comandos nas informações entre aspas e usará o valor resultante como o operando

4

Como uma string entre colchetes. Os caracteres entre a chave aberta e a chave de fechamento correspondente serão usados ​​como o operando sem nenhuma substituição.

5

Como um comando Tcl entre colchetes. O comando será executado e seu resultado será usado como operando.

6

Como uma função matemática cujos argumentos possuem alguma das formas acima para operandos, comopecado ($ x). Veja abaixo uma lista de funções definidas.

Onde as substituições ocorrem acima (por exemplo, dentro de strings citadas), elas são realizadas pelas instruções da expressão. No entanto, uma camada adicional de substituição pode já ter sido executada pelo analisador de comandos antes do processador de expressão ser chamado. Conforme discutido abaixo, geralmente é melhor incluir expressões entre chaves para impedir que o analisador de comandos execute substituições no conteúdo.

Para alguns exemplos de expressões simples, suponha que a variáveluma tem o valor 3 e a variávelbtem o valor 6. Então o comando no lado esquerdo de cada uma das linhas abaixo produzirá o valor no lado direito da linha:

expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * comprimento "6 2" 8 expr {{palavra um} <"palavra $ a"} 0

Operadores

Os operadores válidos estão listados abaixo, agrupados em ordem decrescente de precedência:

- + ~ !

Unário menos, unário mais, bit-wise NOT, NÃO lógico. Nenhum desses operandos pode ser aplicado a operandos de cadeia de caracteres, e NOT em bits pode ser aplicado somente a inteiros.

* / %

Multiplique, divida, restante. Nenhum desses operandos pode ser aplicado a operandos de cadeia, e o restante pode ser aplicado somente a inteiros. O restante sempre terá o mesmo sinal que o divisor e um valor absoluto menor que o divisor.

+ -

Adicione e subtraia. Válido para qualquer operando numérico.

<< >>

Esquerda e direita shift. Válido apenas para operandos inteiros. Uma mudança à direita sempre propaga o bit de sinal.

< > <= >=

Booleano menor, maior, menor ou igual e maior que ou igual. Cada operador produz 1 se a condição for verdadeira, 0 caso contrário. Esses operadores podem ser aplicados a cadeias de caracteres, bem como operandos numéricos, em que a comparação de cadeias de caracteres de caso é usada.

== !=

Booleana igual e não igual. Cada operador produz um resultado zero / um. Válido para todos os tipos de operandos.

&

Bit-wise AND. Válido apenas para operandos inteiros.

^

OR exclusivo em bits. Válido apenas para operandos inteiros.

|

OR bit a bit. Válido apenas para operandos inteiros.

&&

E lógico. Produz um resultado 1 se ambos os operandos forem diferentes de zero, caso contrário, 0. Válido apenas para operandos booleanos e numéricos (inteiros ou de ponto flutuante).

||

OR lógica. Produz um resultado 0 se ambos os operandos forem zero, 1 caso contrário. Válido apenas para operandos booleanos e numéricos (inteiros ou de ponto flutuante).

x ? y : z

If-then-else, como em C. Se x avalia a não-zero, então o resultado é o valor de y . Caso contrário, o resultado é o valor de z . o x operando deve ter um valor numérico.

Veja o manual C para mais detalhes sobre os resultados produzidos por cada operador. Todos os operadores binários se agrupam da esquerda para a direita dentro do mesmo nível de precedência. Por exemplo, o comando

expr 4 * 2 <7

retorna 0.

o&&, ||e?: os operadores têm uma "avaliação lenta", assim como em C, o que significa que os operandos não são avaliados se não forem necessários para determinar o resultado. Por exemplo, no comando

expr {$ v? a: b}

apenas um dosuma oub será realmente avaliado, dependendo do valor de$ v. Observe, no entanto, que isso só é verdadeiro se a expressão inteira estiver entre chaves; caso contrário, o analisador Tcl avaliará ambosuma eb antes de invocar oexpr comando.

Funções matemáticas

O Tcl suporta as seguintes funções matemáticas em expressões:

abs coshregistrosqrt acos em dobrolog10srand como em expprisioneiro de guerrabronzeado um bronzeado chãoRandtanh atan2 fmodvolta ceil hypotpecado cos intsinh

abs ( arg )

Retorna o valor absoluto de arg . Arg pode ser inteiro ou ponto flutuante e o resultado é retornado no mesmo formulário.

acos ( arg )

Retorna o arco cosseno de arg , no intervalo 0, pi radianos. Arg deve estar no intervalo -1,1.

como em( arg )

Retorna o arco seno de arg , no intervalo -pi / 2, pi / 2 radianos. Arg deve estar no intervalo -1,1.

um bronzeado( arg )

Retorna o arco tangente de arg , no intervalo -pi / 2, pi / 2 radianos.

atan2 ( x, y )

Retorna o arco tangente de y / x , no intervalo -pi, pi radianos. x e y não pode ser ambos 0.

ceil ( arg )

Retorna o menor valor inteiro não menor que arg .

cos ( arg )

Retorna o cosseno de arg , medido em radianos.

cosh ( arg )

Retorna o cosseno hiperbólico de arg . Se o resultado causar um estouro, um erro será retornado.

em dobro( arg )

E se arg é um valor flutuante, retorna arg , caso contrário converte arg para flutuante e retorna o valor convertido.

exp ( arg )

Retorna o exponencial de arg , definido como e ** arg . Se o resultado causar um estouro, um erro será retornado.

chão( arg )

Retorna o maior valor integral não maior que arg .

fmod ( x, y )

Retorna o resto de ponto flutuante da divisão de x por y . E se y é 0, um erro é retornado.

hipotago ( x, y )

Calcula o comprimento da hipotenusa de um triângulo retângulo ( x * x + y * y ).

int ( arg )

E se arg é um valor inteiro, retorna arg , caso contrário converte arg para inteiro por truncamento e retorna o valor convertido.

registro( arg )

Retorna o logaritmo natural de arg . Arg deve ser um valor positivo.

log10 ( arg )

Retorna o logaritmo base 10 de arg . Arg deve ser um valor positivo.

prisioneiro de guerra( x, y )

Calcula o valor de x elevado ao poder y . E se x é negativo y deve ser um valor inteiro.

rand ()

Retorna um número de ponto flutuante de zero a apenas menos de um ou, em termos matemáticos, o intervalo 0,1. A semente vem do relógio interno da máquina ou pode ser ajustada manualmente com a função srand.

volta( arg )

E se arg é um valor inteiro, retorna arg , caso contrário converte arg para inteiro por arredondamento e retorna o valor convertido.

pecado( arg )

Retorna o seno de arg , medido em radianos.

sinh ( arg )

Retorna o seno hiperbólico de arg . Se o resultado causar um estouro, um erro será retornado.

sqrt ( arg )

Retorna a raiz quadrada de arg . Arg deve ser não negativo.

srand ( arg )

o arg , que deve ser um inteiro, é usado para redefinir a semente para o gerador de números aleatórios. Retorna o primeiro número aleatório dessa semente. Cada intérprete tem sua própria semente.

bronzeado( arg )

Retorna a tangente de arg , medido em radianos.

tanh ( arg )

Retorna a tangente hiperbólica de arg .

Além dessas funções predefinidas, os aplicativos podem definir funções adicionais usandoTcl_CreateMathFunc().

Tipos, estouro e precisão

Todos os cálculos internos envolvendo inteiros são feitos com o tipo C longo , e todos os cálculos internos envolvendo ponto flutuante são feitos com o tipo C em dobro . Ao converter uma cadeia em ponto flutuante, o excesso de expoente é detectado e resulta em um erro Tcl. Para conversão para inteiro da cadeia, a detecção de sobrecarga depende do comportamento de algumas rotinas na biblioteca C local, portanto, ela deve ser considerada não confiável. Em qualquer caso, o estouro de inteiro e underflow geralmente não são detectados de forma confiável para resultados intermediários. O estouro de ponto flutuante e o estouro negativo são detectados no grau suportado pelo hardware, o que geralmente é bastante confiável.

A conversão entre representações internas para operandos de inteiro, ponto flutuante e cadeia é feita automaticamente conforme necessário. Para cálculos aritméticos, inteiros são usados ​​até que algum número de ponto flutuante seja introduzido, após o qual o ponto flutuante é usado. Por exemplo,

expr 5/4

retorna 1, enquanto

expr 5 / 4,0 expr 5 / (comprimento da corda "abcd" + 0.0)

ambos retornam 1,25. Valores de ponto flutuante são sempre retornados com um ``.'' ou ume para que eles não se pareçam com valores inteiros. Por exemplo,

expr 20,0 / 5,0

retorna4.0, não4.

Operações de cordas

Os valores de cadeia podem ser usados ​​como operandos dos operadores de comparação, embora o avaliador de expressão tente fazer comparações como inteiro ou ponto flutuante quando puder. Se um dos operandos de uma comparação for uma string e o outro tiver um valor numérico, o operando numérico é convertido de volta para uma string usando o C sprintf especificador de formato% d para inteiros e% g para valores de ponto flutuante. Por exemplo, os comandos

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

ambos retornam 1. A primeira comparação é feita usando a comparação de inteiros, e a segunda é feita usando a comparação de cadeias após o segundo operando ser convertido para a cadeia18. Por causa da tendência do Tcl de tratar valores como números sempre que possível, geralmente não é uma boa idéia usar operadores como==quando você realmente quer uma comparação de strings e os valores dos operandos podem ser arbitrários; é melhor nestes casos usar ocorda comando em vez disso.

Considerações de desempenho

Coloque expressões entre chaves para a melhor velocidade e os menores requisitos de armazenamento. Isso permite que o compilador de bytecode Tcl gere o melhor código.

Como mencionado acima, as expressões são substituídas duas vezes: uma vez pelo analisador Tcl e uma vez pelo expr comando. Por exemplo, os comandos

defina um 3 set b {$ a + 2} expr $ b * 4

retornar 11, não um múltiplo de 4. Isto é porque o analisador Tcl primeiro substituirá$ a + 2 para a variávelb, então oexpr comando irá avaliar a expressão$ a + 2 * 4.

A maioria das expressões não requer uma segunda rodada de substituições. Eles são colocados entre chaves ou, se não, suas substituições de comando e variável geram números ou seqüências que não requerem substituições. No entanto, como algumas expressões não liberadas precisam de duas rodadas de substituições, o compilador bytecode deve emitir instruções adicionais para lidar com essa situação. O código mais caro é necessário para expressões soltas que contêm substituições de comandos. Essas expressões devem ser implementadas gerando novo código toda vez que a expressão for executada.

Palavras-chave

aritmética, boolean, compare, expression, fuzzy comparison

Importante: Use o homem comando ( % homem ) para ver como um comando é usado em seu computador particular.