Bash deja el comando incorporado

dejar el mando

En Tipo Unix sistemas operativos, dejar es un comando incorporado del Intento shell que evalúa expresiones aritméticas.

Descripción

Utilizando dejar es similar a encerrar una expresión aritmética entre paréntesis dobles, por ejemplo:

|_+_|

Sin embargo, a diferencia de (( ... )) , el cual es un comando compuesto , dejar es un comando incorporado. Como tal, sus argumentos individuales están sujetos a expansión por bash. Por ejemplo, dejar los argumentos se someten a globbing, expansión de nombre de ruta , y división de palabras a menos que incluya los argumentos individuales entre comillas dobles.

En la mayoría de las situaciones, es preferible utilizar paréntesis dobles para evaluar expresiones aritméticas. Sin embargo, es importante comprender cómo dejar es diferente y utilícelo cuando corresponda.

Como todos los comandos simples, dejar tiene su propio entorno. Las variables utilizadas en las expresiones tienen un alcance local para el comando. Entonces, por ejemplo, un argumento para dejar no es consciente de otras variables de shell, a menos que sean exportado .

La excepción es cuando dejar evalúa una expresión que establece explícitamente el valor de una variable. En ese caso, el valor de esa variable persiste en el shell actual. (Si esto suena un poco complicado, es porque lo es. Consulte a continuación para ejemplos .)

Sintaxis

|_+_|

Descripción

dejar evalúa cada argumento, enfadado , como expresión matemática. Los argumentos se evalúan de izquierda a derecha.

Todos los números se representan internamente como enteros de ancho fijo. (Bash no admite aritmética de punto flotante).

No Desbordamiento Se realiza la verificación, por lo que las operaciones con números enteros muy grandes pueden producir un resultado inesperado, sin provocar un error.

Sin embargo, se detecta la división por cero y provoca un error.

Operadores aritméticos

Al evaluar una expresión, dejar interpreta los siguientes operadores matemáticos y realiza la operación correspondiente. En la siguiente tabla, los operadores se enumeran fila por fila en orden de precedencia decreciente. Los operadores enumerados en la misma fila tienen la misma precedencia.

Operador Operación
dónde ++ , dónde -- Post-incremento ( ++ ), Post-decremento ( -- ).
Interpretar el valor de la variable entera dónde y luego sume o reste uno (1).
++ dónde , -- dónde Preincremento ( ++ ), Pre-decremento ( -- ).
Sumar o restar uno (1) al valor de la variable entera dónde y luego interprete el valor.
- expr , + expr Unario menos, Unario más.
Unario menos devuelve el valor de la expresión. expr precede, como si se hubiera multiplicado por uno negativo (-1). Unario más devuelve la expresión expr sin cambios, como si se hubiera multiplicado por uno (1).
! , ~ Lógico negación, negación bit a bit.
La negación lógica devuelve falso si su operando es verdadero y verdadero si el operando es falso.
La negación bit a bit invierte los bits en la representación binaria del operando numérico.
** Exponenciación.
* , / , % Multiplicación, división, resto (módulo).
+ , - Suma resta.
<< , >> Desplazamiento bit a bit a la izquierda, desplazamiento a bit a la derecha.
<= , >= , < , > Comparación: menor o igual a, mayor o igual a, menor que, mayor que.
== , != Igualdad, desigualdad.
La igualdad devuelve verdadero si sus operandos son iguales, falso en caso contrario. La desigualdad devuelve verdadero si sus operandos no son iguales, falso en caso contrario.
& AND bit a bit.
Los dígitos binarios correspondientes de ambos operandos se multiplican para producir un resultado. Para cualquier dígito dado, el dígito resultante es 1 sólo si el dígito correspondiente en ambos operandos también es 1 .
^ XOR bit a bit (OR exclusivo).
Un dígito binario del resultado es 1 si y solo si los dígitos correspondientes de los operandos difieren. Por ejemplo, si el primer dígito binario del primer operando es 1 , y el primer dígito del segundo operando es 0 , el primer dígito del resultado es 1 .
| OR bit a bit.
Si alguno de los dígitos correspondientes en los operandos es 1 , ese dígito en el resultado también es 1 .
&& AND lógico.
Devuelve verdadero si ambos operandos son verdaderos.
|| OR lógico.
Devuelve verdadero si alguno de los operandos es verdadero.
expr1 ? expr2 : expr3 Condicional ( ternario ) operador.
Si expr1 es verdad, vuelve expr2 . Si expr1 es falso, vuelve expr3 .
= , *= , /= , %= , += , -= , <<= , >>= , &= , ^= , |= Asignación.
Asignar el valor de la expresión que sigue al operador, a la variable que lo precede. Si un operador antepone el signo igual, esa operación se realiza antes de la asignación.
Por ejemplo, sea ​​'var + = 5' es equivalente a sea ​​'var = var + 5' . La operación de asignación en sí misma evalúa el valor asignado.

Estado de salida

Si el argumento de la derecha proporcionado a dejar evalúa a cero (aritméticamente falso), el estado de salida es 1 (Estado de salida FALSO).

Si el argumento de la derecha proporcionado a dejar evalúa a un valor distinto de cero (aritméticamente verdadero), el estado de salida es 0 (Estado de salida VERDADERO).

Otras formas de evaluar la aritmética

Antes de que comencemos a usar dejar , veamos otras formas de hacer cosas similares en bash. Entonces veremos como dejar es un poco diferente.

Para comenzar, establezca el valor de una variable. Puedes hacer esto en bash sin dejar , usando el formulario varname = valor . Por ejemplo:

|_+_|

Observe que no hay espacio antes o después del signo igual. Si pones un espacio antes del = , bash asume myvar es un nombre de comando. Por ejemplo:

|_+_| |_+_|

Del mismo modo, obtiene un error si coloca un espacio después del signo igual:

|_+_| |_+_|

Bash interpreta el comando anterior como: 'Con myvar sin igualar nada, ejecuta el comando 5 . Entonces, al asignar variables de esta manera en bash, asegúrese de no usar espacios alrededor del signo igual.

De forma predeterminada, las variables de bash son 'sin tipo', no tienen un inherente tipo de datos . Por ejemplo, puede asignar un número entero o un cuerda valor a una variable sin tipo. Entonces, si intentamos asignar '5 + 5' a myvar , está asignado literalmente , como una cadena, y no se realizan operaciones matemáticas en ella.

|_+_| |_+_|

Sin embargo, si lo desea, puede declarar una variable como tipo entero usando el declare comando incorporado. Utilizando declarar -i establece el atributo 'integer' para su variable, que habilita la evaluación aritmética al asignar un valor.

|_+_| |_+_|

Antes de continuar, desarmemos el atributo integer, haciendo que la variable vuelva a ser sin tipo. Puede hacer esto usando un signo más, en lugar de un guión, delante de la letra de la opción:

|_+_|

Otra forma de realizar la evaluación aritmética de una expresión es encerrarla entre paréntesis dobles:

|_+_| |_+_|

Darse cuenta de myvar está entre paréntesis dobles: la asignación de variable es parte de la expresión. Además, observe que está bien tener espacios antes y después del signo igual en una expresión aritmética.

Para devolver el valor de una expresión aritmética directamente, de modo que su resultado se pueda usar como parte de una declaración más grande, anteponga al paréntesis doble un signo de dólar (' $ '), como esto:

|_+_| |_+_|

Usando el signo de dólar, el resultado final de la expresión se devuelve como valor. Usando esta sintaxis, no necesitamos establecer una variable para usar el valor más tarde.

Además, tenga en cuenta que las expresiones de paréntesis dobles pueden ser anidado :

|_+_| |_+_| |_+_| |_+_|

Ahora realicemos algunos comandos de ejemplo usando dejar .

Ejemplos de

|_+_|

Establecer la variable myvar al valor 5 , luego echo El valor de myvar a la terminal. Producción:

|_+_| |_+_|

Colocar varone a 1 , colocar vartwo al valor de varone , luego incrementa el valor de varone por uno. Producción:

|_+_| |_+_|

Colocar varone a 1 , incrementar el valor de varone por uno, luego establezca el valor de vartwo al valor de varone . Producción:

|_+_| |_+_|

Colocar myvar al resto de 48 dividido por 5 (que es 3 ). Producción:

|_+_| |_+_|

Colocar myvar al numero 16 , desplazado a la izquierda dos veces (lo que da el mismo resultado que multiplicarlo por 2, dos veces). Producción:

|_+_| |_+_|

Colocar myvar al numero 16 , desplazado a la derecha dos veces (lo que da el mismo resultado que dividirlo por 2, dos veces). Producción:

|_+_| |_+_|

Colocar myvar a 5 , luego establece myvar a su propio valor multiplicado por 2 . Observe que en este ejemplo, las declaraciones secuenciales están separadas por una coma. Producción:

|_+_| |_+_|

Colocar bar a 5 , luego establezca el valor de bar al valor de foo . Cuando bash procesa el siguiente comando (' echo $ foo, $ bar '), sabe sobre foo porque su valor se estableció en la expresión. Sin embargo, no conoce bar porque el valor de la barra era local al comando anterior. Producción:

|_+_| |_+_|

Similar al comando anterior, pero esta vez, dejar cambia el valor de bar incrementándolo. Entonces bar El alcance se convierte en el shell actual, y el echo El comando es consciente de su valor. Producción:

|_+_|

eval - Evaluar argumentos y ejecutarlos como un comando.