Saltar al contenido

Operadores lógicos simples en Bash

Nuestros mejores investigadores han agotado sus provisiones de café, en su búsqueda diariamente por la resolución, hasta que Alexa encontró el hallazgo en GitHub y hoy la compartimos aquí.

Solución:

Lo que ha escrito en realidad casi funciona (funcionaría si todas las variables fueran números), pero no es una forma idiomática en absoluto.

  • (…) los paréntesis indican una subcapa. Lo que hay dentro de ellos no es una expresión como en muchos otros idiomas. Es una lista de comandos (como fuera de los paréntesis). Estos comandos se ejecutan en un subproceso separado, por lo que cualquier redirección, asignación, etc. realizada dentro de los paréntesis no tiene efecto fuera de los paréntesis.
    • Con un signo de dólar al frente, $(…) es una sustitución de comando: hay un comando entre paréntesis, y la salida del comando se usa como parte de la línea de comando (después de expansiones adicionales, a menos que la sustitución esté entre comillas dobles, pero esa es otra historia).
  • Las llaves son como paréntesis en el sentido de que agrupan comandos, pero solo influyen en el análisis, no en la agrupación. El programa x=2; x=4; ; echo $x imprime 4, mientras que x=2; (x=4); echo $x imprime 2. (También las llaves requieren espacios alrededor de ellas y un punto y coma antes de cerrar, mientras que los paréntesis no. Eso es solo una peculiaridad de sintaxis).
    • Con un signo de dólar al frente, $VAR es una expansión de parámetros, expandiéndose al valor de una variable, con posibles transformaciones adicionales.
  • ((…)) los paréntesis dobles rodean una instrucción aritmética, es decir, un cálculo de números enteros, con una sintaxis que se asemeja a otros lenguajes de programación. Esta sintaxis se usa principalmente para asignaciones y en condicionales.
    • La misma sintaxis se usa en expresiones aritméticas. $((…))que se expanden al valor entero de la expresión.
  • [[ … ]] los corchetes dobles rodean las expresiones condicionales. Las expresiones condicionales se basan principalmente en operadores como -n $variable para probar si una variable está vacía y -e $file para probar si existe un archivo. también hay string operadores de igualdad: "$string1" == "$string2" (Tenga en cuenta que el lado derecho es un patrón, por ejemplo [[ $foo == a* ]] prueba si $foo comienza con a mientras [[ $foo == "a*" ]] prueba si $foo es exactamente a*), y lo conocido !, && y || operadores de negación, conjunción y disyunción, así como paréntesis para agrupar. Tenga en cuenta que necesita un espacio alrededor de cada operador (p. ej. [[ "$x" == "$y" ]]no [[ "$x"=="$y" ]]), y un espacio o un carácter como ; tanto dentro como fuera de los paréntesis (p. ej. [[ -n $foo ]]no [[-n $foo]]).
  • [ … ] los corchetes simples son una forma alternativa de expresiones condicionales con más peculiaridades (pero más antiguas y portátiles). No escribas ninguno por ahora; comience a preocuparse por ellos cuando encuentre guiones que los contengan.

Esta es la forma idiomática de escribir su prueba en bash:

if [[ $varA == 1 && ($varB == "t1" || $varC == "t2") ]]; then

Si necesita portabilidad a otros shells, esta sería la forma (tenga en cuenta las citas adicionales y los conjuntos separados de corchetes alrededor de cada prueba individual, y el uso de la tradicional = operador en lugar de ksh/bash/zsh == variante):

if [ "$varA" = 1 ] &&  [ "$varB" = "t1" ] ; then

muy cerca

if [[ $varA -eq 1 ]] && [[ $varB == 't1' || $varC == 't2' ]]; 
  then 
    scale=0.05
  fi

Deberia trabajar.

romperlo

[[ $varA -eq 1 ]] 

es una comparación de enteros donde como

$varB == 't1'

es un string comparación. de lo contrario, solo estoy agrupando las comparaciones correctamente.

Los corchetes dobles delimitan una expresión condicional. Y considero que lo siguiente es una buena lectura sobre el tema: “(IBM) Prueba de desmitificación, [, [[, ((, and if-then-else”

A very portable version (even to legacy bourne shell):

if [ "$varA" = 1 -a ( "$varB" = "t1" -o "$varB" = "t2" ) ]
entonces haz algo fi

Esto tiene la cualidad adicional de ejecutar solo un subproceso como máximo (que es el proceso [), sea cual sea el sabor de la cáscara.

Reemplazar = con -eq si las variables contienen valores numéricos, por ejemplo

  • 3 -eq 03 es truepero
  • 3 = 03 es false. (string comparación)

Reseñas y calificaciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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