miércoles, 1 de marzo de 2017

Una versión más moderna de test

Versiones recientes de bash incluyen un comando compuesto que actúa como reemplazo mejorado de test. Usa la siguiente sintaxis:

[[ expresión ]]

donde, como en test, expresión es una expresión que se evalúa como un resultado verdadero o falso. El comando [[ ]] es muy parecido a test (soporta todas sus expresiones), pero añade una nueva expresión de cadena importante:

cadena1 =~ regex

que devuelve verdadero si cadena1 coincide con la expresión regular extendida regex. Esto abre un montón de posibilidades para realizar tareas tales como validación de datos. En nuestro ejemplo anterior de las expresiones con enteros, el script fallaría si la constante INT contiene cualquier cosa que no sea un entero. El script necesita una forma de verificar si la constante contiene un entero. Usando [[ ]] con el operador de expresión para cadenas  =~, se podría mejorar el script de esta forma:

#!/bin/bash

# test-integer2: evaluate the value of an integer.

INT=-5

if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
     if [ $INT -eq 0 ]; then
          echo "INT is zero."
     else
          if [ $INT -lt 0 ]; then
               echo "INT is negative."
          else
               echo "INT is positive."
          fi
          if [ $((INT % 2)) -eq 0 ]; then
               echo "INT is even."
          else
               echo "INT is odd."
          fi
     fi
else
     echo "INT is not an integer." >&2
     exit 1
fi

Aplicando la expresión regular, podemos limitar el valor de INT a sólo cadenas que comiencen con un signo menos opcional, seguido de uno o más números. Esta expresión también elimina la posibilidad de valores vacíos.

Otra característica añadida de [[ ]] es que el operador == soporta coincidencias de patrones de la misma forma que lo hace la expansión de nombre de archivo. Por ejemplo:

[me@linuxbox ~]$ FILE=foo.bar
[me@linuxbox ~]$ if [[ $FILE == foo.* ]]; then
> echo "$FILE matches pattern 'foo.*'"
> fi
foo.bar matches pattern 'foo.*'

Esto hace a [[ ]] útil para evaluar archivos y rutas.

No hay comentarios:

Publicar un comentario