Estaciones de trabajo en línea OnWorks Linux y Windows

Logotipo

Alojamiento gratuito en línea para estaciones de trabajo

<Anterior | Contenido | Siguiente>

Combinando Expresiones

También es posible combinar expresiones para crear evaluaciones más complejas. Las expresiones se combinan utilizando operadores lógicos. Los vimos en el capítulo 17, cuando nos enteramos de la find mando. Hay tres operaciones lógicas para testea y [[]]. Son Y, O y NO. testea y [[]] utilice diferentes operadores para representar estas operaciones:


Tabla 27-4: Operadores lógicos


Operación TESt [[]] y (())

Operación TESt [[]] y (())

Y -a &&


imagen

OR -o ||


imagen

NO ! !


imagen


A continuación, se muestra un ejemplo de una operación AND. La siguiente secuencia de comandos determina si un número entero está dentro de un rango de valores:



#! / Bin / bash


# test-integer3: determina si un número entero está dentro de un

# rango de valores especificado.


MIN_VAL = 1 MAX_VAL = 100


INT = 50

#! / Bin / bash


# test-integer3: determina si un número entero está dentro de un

# rango de valores especificado.


MIN_VAL = 1 MAX_VAL = 100


INT = 50



si [["$ INT" = ~ ^ -? [0-9] + $]]; luego

si [[INT -ge MIN_VAL && INT -le MAX_VAL]]; luego repita "$ INT está entre $ MIN_VAL y $ MAX_VAL".

más

echo "$ INT está fuera de rango".

fi más

echo "INT no es un número entero". > & 2 salida 1

fi


si [["$ INT" = ~ ^ -? [0-9] + $]]; luego

si [[INT -ge MIN_VAL && INT -le MAX_VAL]]; luego repita "$ INT está entre $ MIN_VAL y $ MAX_VAL".

más

echo "$ INT está fuera de rango".

fi más

echo "INT no es un número entero". > & 2 salida 1

fi


En este script, determinamos si el valor de integer INT se encuentra entre los valores de VALOR_MÍN y MAX_VAL. Esto se realiza mediante un solo uso de [[]], que incluye dos expresiones separadas por el && operador. También podríamos haber codificado esto usando testea:


if [ $ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL ]; luego repita "$ INT está entre $ MIN_VAL y $ MAX_VAL".

más

echo "$ INT está fuera de rango".

fi

if [ $ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL ]; luego repita "$ INT está entre $ MIN_VAL y $ MAX_VAL".

más

echo "$ INT está fuera de rango".

fi


La ! El operador de negación invierte el resultado de una expresión. Devuelve verdadero si una expresión es falsa y devuelve falso si una expresión es verdadera. En el siguiente script, modificamos la lógica de nuestra evaluación para encontrar valores de INT que están fuera del rango especificado:



#! / Bin / bash


# test-integer4: determina si un entero está fuera de un

# rango de valores especificado.


MIN_VAL = 1 MAX_VAL = 100


INT = 50


si [["$ INT" = ~ ^ -? [0-9] + $]]; luego

si [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL)]]; luego repita "$ INT está fuera de $ MIN_VAL a $ MAX_VAL".

más

echo "$ INT está dentro del rango".

#! / Bin / bash


# test-integer4: determina si un entero está fuera de un

# rango de valores especificado.


MIN_VAL = 1 MAX_VAL = 100


INT = 50


si [["$ INT" = ~ ^ -? [0-9] + $]]; luego

si [[ ! (INT -ge MIN_VAL && INT -le MAX_VAL)]]; luego repita "$ INT está fuera de $ MIN_VAL a $ MAX_VAL".

más

echo "$ INT está dentro del rango".



echo "INT no es un número entero". > & 2 salida 1

fi


echo "INT no es un número entero". > & 2 salida 1

fi

También incluimos paréntesis alrededor de la expresión, para agrupar. Si no se incluyen, la negación solo se aplicaría a la primera expresión y no a la combinación de las dos. Codificando esto con testea se haría de esta manera:


si [ ! \ ($ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL \)]; luego repita "$ INT está fuera de $ MIN_VAL a $ MAX_VAL".

más

echo "$ INT está dentro del rango".

fi

si [ ! \ ($ INT -ge $ MIN_VAL -a $ INT -le $ MAX_VAL \)]; luego repita "$ INT está fuera de $ MIN_VAL a $ MAX_VAL".

más

echo "$ INT está dentro del rango".

fi


Dado que todas las expresiones y operadores utilizados por testea son tratados como argumentos de comando por el shell (a diferencia de [[]] y (()) ), caracteres que tienen un significado especial para golpear, Tales como <, >, ( y ), debe ser cotizado o evitado.

imagen

Viendo eso testea y [[]] hacer aproximadamente lo mismo, que es preferible? testea es tradicional (y parte de POSIX), mientras que [[]] es específico para golpear. Es importante saber cómo usar testea, ya que es muy utilizado, pero [[]] es claramente más útil y más fácil de codificar, por lo que se prefiere para los scripts modernos.


La portabilidad es el duende de las pequeñas mentes

Si habla con gente "real" de Unix, rápidamente descubrirá que a muchos de ellos no les gusta mucho Linux. Lo consideran impuro e inmundo. Un principio de los usuarios de Unix es que todo debe ser "portátil". Esto significa que cualquier script que escriba debería poder ejecutarse, sin cambios, en cualquier sistema similar a Unix.

La gente de Unix tiene buenas razones para creer esto. Habiendo visto lo que las extensiones propietarias de comandos y shells le hicieron al mundo Unix antes de POSIX, naturalmente desconfían del efecto de Linux en su amado sistema operativo.

Pero la portabilidad tiene una seria desventaja. Impide el progreso. Requiere que las cosas se hagan siempre utilizando técnicas de "mínimo común denominador". En el caso de la programación de shell, significa hacer que todo sea compatible con sh, la cáscara de Bourne original.



imagen

Esta desventaja es la excusa que utilizan los proveedores de software propietario para justificar sus extensiones patentadas, solo que ellos las llaman "innovaciones". Pero en realidad son solo dispositivos de bloqueo para sus clientes.

Las herramientas GNU, como golpear, no tienen tales restricciones. Fomentan la portabilidad al respaldar los estándares y al estar disponibles universalmente. Puedes instalar golpear y las otras herramientas GNU en casi cualquier tipo de sistema, incluso Windows, sin costo. No dude en utilizar todas las funciones de golpear. Es realmente portátil.


Top OS Cloud Computing en OnWorks: