Cómo usar pruebas condicionales de doble paréntesis en Linux

fatmawati achmad zaenuri / Shutterstock.com

Las pruebas condicionales ramifican el flujo de ejecución del script de Linux Bash en función del resultado de una expresión lógica. Las pruebas condicionales de doble paréntesis simplifican la sintaxis considerablemente, pero aún tienen sus trucos.

Índice de contenidos
  1. Soportes simples y dobles
  2. Integrado y palabras clave
  3. Globbing de concha
  4. Citando las cuerdas
  5. Nombre de archivo Globbing Gotchas
  6. AND lógico y OR
  7. regex
  8. Solo una condición

Soportes simples y dobles

Bash proporciona el test mando. Esto le permite probar expresiones lógicas. La expresión devolverá una respuesta que indica una respuesta verdadera o falsa. Una respuesta verdadera se indica con un valor de retorno de cero. Cualquier cosa que no sea cero indica falso.

Encadenar comandos en la línea de comandos con el && el operador utiliza esta función. Los comandos solo se ejecutan si el comando anterior se completa correctamente.

Si la prueba es verdadera, se imprimirá la palabra "Sí".

test 15 -eq 15 && echo "Yes"
test 14 -eq 15 && echo "Yes"

Ejemplos simples del comando de prueba Bash

Las pruebas condicionales de paréntesis simple imitan la test mando. Incluya la expresión entre paréntesis "[ ]"Y operar como el test mando. De hecho, son el mismo programa, creado a partir del mismo código fuente. La única diferencia operativa es cómo test versión y la [ version handle help requests.

This is from the source code:

/* Recognize --help or --version, but only when invoked in the
"[" form, when the last argument is not "]". Utilice el análisis directo, en lugar de parse_long_options, para evitar aceptar abreviaturas. POSIX permite"[ --help" and "[ --version" to
have the usual GNU behavior, but it requires "test --help"
and "test --version" to exit silently with status 0. */

We can see the effect of this by asking test and [ for help and checking the response code sent to Bash.

test --help
echo $?
[ --help
echo $?

Using --help on test and [

Both test and [ are shell builtins, meaning they are baked right into Bash. But there’s also a standalone binary version of [ .

type test
type [
whereis [

Finding the different types of [ and test commands

By contrast, the double bracket conditional tests [[ and ]] yo soy palabra clave. [[ and ]] también realizan pruebas lógicas, pero su sintaxis es diferente. Dado que son palabras clave, puede utilizar algunas funciones interesantes que no funcionarán en la versión de un solo paréntesis.

Las palabras clave de corchetes dobles son compatibles con Bash, pero no están disponibles en todos los demás shells. Por ejemplo, el caparazón de Korn los admite, pero el viejo caparazón simple, sh, no lo hace. Todos nuestros scripts comienzan con la línea:

#!/bin/bash

Esto asegura que estamos llamando al shell Bash para ejecutar el script.

RELACIONADO: Cómo crear y ejecutar scripts de Bash Shell en Windows 10

Integrado y palabras clave

Podemos usar el compgen programa para listar incorporados:

compgen -b | fmt -w 70

Sin canalizar la salida a través fmt obtendríamos una lista larga con cada uno incorporado en su propia línea. En este caso, es más conveniente ver los comandos integrados agrupados en un párrafo.

Lista de las funciones integradas de Bash

Podemos ver test Y [ in the list, but ] no está en la lista. El [ command looks for a closing ] para detectar cuando ha llegado al final de la expresión, pero ] no es una función incorporada por separado. Es solo una señal que le damos a [ to indicate the end of the parameter list.

To see the keywords, we can use:

compgen -k | fmt -w 70

Listing the Bash keywords

The [[ and ]] las palabras clave están en la lista, porque [[ is a one keyword and ]] y otro. Son una pareja emparejada, al igual que if Y fi , Y case Y esac .

Cuando Bash está analizando un script o línea de comando y detecta una palabra clave que tiene una palabra clave de cierre coincidente, recopila todo lo que aparece entre ellos y aplica cualquier tratamiento especial respaldado por las palabras clave.

Con un comando incorporado, lo que sigue al comando incorporado se le pasa al igual que los parámetros de cualquier otro programa de línea de comandos. Esto significa que el guionista debe prestar especial atención a cosas como los espacios en los valores de las variables.

Globbing de concha

Las pruebas condicionales de doble paréntesis pueden hacer uso de shell globbing. Esto significa el asterisco "*"se expandirá para significar" cualquier cosa ".

Escriba o copie el siguiente texto en un editor y guárdelo en un archivo llamado "whelkie.sh".

#!/bin/bash

stringvar="Whelkie Brookes"

if [[ "$stringvar" == *elk* ]];
then
  echo "Warning contains seafood"
else
  echo "Free from molluscs"
fi

Para hacer ejecutable el script tendremos que usar el chmod comando con el -x Opción (ejecutar). Deberá hacer esto para todos los scripts de este artículo si desea probarlos.

chmod +x whelkie.sh

Utilice chmod para hacer un script ejecutable

Cuando ejecutamos el script, vemos que la cadena "elk" se encontró en la cadena "Whelkie", independientemente de qué otros caracteres la rodean.

./whelkie.sh

Ejecutando el script whelkie.sh

Un punto a tener en cuenta es que no incluimos la cadena de búsqueda entre comillas. Si lo hace, no se producirá el globbing. La cadena de búsqueda se tratará literalmente.

Se permiten otras formas de globular de caparazón. El signo de interrogación "?”Coincidirá con caracteres individuales y se utilizan corchetes simples para indicar rangos de caracteres. Por ejemplo, si no sabe qué caso utilizar, puede cubrir ambas eventualidades con un intervalo.

#!/bin/bash

stringvar="Jean-Claude van Clam"

if [[ "$stringvar" == *[cC]lam* ]];
then
  echo "Warning contains seafood."
else
  echo "Free from molluscs."
fi

Guarde este script como "damme.sh" y hágalo ejecutable. Cuando lo ejecutamos, la instrucción condicional se resuelve como verdadera y se ejecuta la primera cláusula de la instrucción if.

./damme.sh

Ejecutando el script damme.sh

Citando las cuerdas

Anteriormente mencionamos envolver cadenas entre comillas. Si lo hace, no se producirá la formación de burbujas de caparazón. Incluso si la convención dice que es una buena práctica, no necesitar envuelva las variables de cadena entre comillas cuando use [[ and ]]incluso si contienen espacios. Vea el siguiente ejemplo. ambos $stringvar Y $surname las variables de cadena contienen espacios, pero ninguno se menciona en la declaración condicional.

#!/bin/bash

stringvar="van Damme"
surname="van Damme"

if [[ $stringvar == $surname ]];
then
echo "Surnames match."
else
echo "Surnames don't match."
fi

Guárdelo en un archivo llamado "apellido.sh" y hágalo ejecutable. Ejecútelo usando:

./surname.sh

Ejecutando el script surname.sh

Aunque ambas cadenas contienen espacios, la secuencia de comandos se realiza correctamente y la declaración condicional se resuelve como verdadera. Esto es útil cuando se trata de rutas y nombres de directorios que contienen espacios. aquí el -d la opción devuelve verdadero si la variable contiene un nombre de directorio válido.

#!/bin/bash

dir="/home/dave/Documents/Needs Work"

if [[ -d ${dir} ]];
then
  echo "Directory confirmed"
else
  echo "Directory not found"
fi

Si cambia la ruta en el script para reflejar un directorio en su computadora, guarde el texto en un archivo llamado "dir.sh" y hágalo ejecutable, puede ver que funciona.

./dir.sh

Ejecutando el script dir.sh

RELACIONADO: Cómo trabajar con variables en Bash

Nombre de archivo Globbing Gotchas

Una diferencia interesante entre [ ] Y [[ ]] se refiere a los nombres de archivo que contienen globbing. El módulo "* .sh" coincidirá con todos los archivos de secuencia de comandos. Usar paréntesis simple [ ] falla a menos que haya un solo archivo de secuencia de comandos. Encontrar más de un script da como resultado un error.

Aquí está el guión con condicionales de un solo paréntesis.

#!/bin/bash

if [ -a *.sh ];
then
  echo "Found a script file"
else
  echo "Didn't find a script file"
fi

Hemos guardado este texto en "script.sh" y lo hemos hecho ejecutable. Verificamos cuántos scripts había en el directorio y luego ejecutamos el script.

ls
./script.sh

Ejecutando el script script.sh

Bash arroja un error. Eliminamos todos los archivos de script menos uno y volvimos a ejecutar el script.

ls
./script.sh

Ejecutar el script script.sh con un único script en el directorio

La prueba condicional devuelve verdadero y el script no genera errores. Cambiar el guión para usar doble paréntesis proporciona un tercer tipo de comportamiento.

#!/bin/bash

if [[ -a *.sh ]];
then
  echo "Found a script file"
else
  echo "Didn't find a script file"
fi

Lo guardamos en un archivo llamado "dscript.sh" y lo hicimos ejecutable. La ejecución de este script en un directorio con muchos scripts no genera un error, pero el script no reconoce ningún archivo de script.

La declaración condicional que usa paréntesis dobles se resuelve como verdadera solo en el caso poco probable de que realmente tenga un archivo llamado "* .sh" en el directorio.

./dscript.sh

Ejecutando el script dscript.sh

AND lógico y OR

Los paréntesis dobles le permiten usar && Y || como operadores lógicos AND y OR.

Este script debe resolver la declaración condicional a verdadera porque 10 es igual a 10 Y 25 es menos que 26.

#!/bin/bash

first=10
second=25

if [[ first -eq 10 && second -lt 26 ]];
then
  echo "Condition met"
else
  echo "Condition failed"
fi

Guarde este texto en un archivo llamado "and.sh", hágalo ejecutable y ejecútelo con:

./and.sh

Ejecutando el script and.sh

El script se ejecuta como era de esperar.

Esta vez usaremos el || operador. El enunciado condicional debe resolverse como verdadero porque aunque 10 no es mayor que 15, 25 todavía es menor que 26. Hasta la primera comparación o la segunda comparación es verdadera, el enunciado condicional en su conjunto resulta ser verdadero.

Guarde este texto como "or.sh" y hágalo ejecutable.

#!/bin/bash

first=10
second=25

if [[ first -gt 15 || second -lt 26 ]];
then
  echo "Condition met."
else
  echo "Condition failed."
fi
./or.sh

Ejecutando el script or.sh

regex

Las declaraciones condicionales entre paréntesis dobles permiten el uso de =~ operador, que aplica patrones de búsqueda de expresiones regulares en una cadena a la otra mitad de la declaración. Si se satisface la expresión regular, la declaración condicional se considera verdadera. Si la expresión regular no encuentra ninguna coincidencia, la declaración condicional se resuelve como falsa.

RELACIONADO: Cómo usar expresiones regulares (regex) en Linux

Guarde este texto en un archivo llamado "regex.sh" y hágalo ejecutable.

#!/bin/bash

words="one two three"
WordsandNumbers="one 1 two 2 three 3"
email="[email protected]abricateddomain.co.uk"

mask1="[0-9]"
mask2="[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+.[A-Za-z]{2,4}"

if [[ $words =~ $mask1 ]];
then
  echo ""$words" contains digits."
else
  echo "No digits found in "$words"."
fi

if [[ $WordsandNumbers =~ $mask1 ]];
then
  echo ""$WordsandNumbers" contains digits."
else
  echo "No digits found in "$WordsandNumbers"."
fi

if [[ $email =~ $mask2 ]];
then
  echo ""$email" is a valid e-mail address."
else
  echo "Couldn't parse "$email"."
fi

El primer conjunto de paréntesis dobles usa la variable de cadena $mask1 como expresión regular. Contiene el patrón para todos los dígitos en el rango de cero a nueve. Aplicar esta expresión regular a la $words variable de cadena.

El segundo conjunto de paréntesis dobles todavía usa la variable de cadena $mask1 como la expresión regular, pero esta vez úsala con la $WordsandNumbers variable de cadena.

El último conjunto de paréntesis dobles usa una máscara de expresiones regulares más compleja en la variable de cadena $mask2 .

  • [A-Za-z0-9._%+-]+- Coincide con cualquier carácter que sea una letra mayúscula o minúscula, o cualquier dígito del cero al nueve, o un punto, un guión bajo, un signo de porcentaje o un signo más o menos. El "+"Afuera de"[]”Significa repetir esas coincidencias para todos los personajes que encuentre.
  • @: Coincide solo con el carácter "@".
  • [A-Za-z0-9.-]+- Coincide con cualquier carácter que sea una letra mayúscula o minúscula, o cualquier dígito del cero al nueve, o un punto o guión. El "+"Afuera de"[ ]”Significa repetir esas coincidencias para todos los personajes que encuentre.
  • .: corresponde a "." único personaje.
  • [A-Za-z]{2,4}- Coincide con cualquier letra mayúscula o minúscula. El "{2,4}”Significa hacer coincidir al menos dos caracteres y como máximo cuatro.

Poniéndolo todo junto, la máscara de expresiones regulares verificará si una dirección de correo electrónico está formada correctamente.

Guarde el texto del script en un archivo llamado "regex.sh" y hágalo ejecutable. Cuando ejecutamos el script obtenemos esta salida.

./regex.sh

Ejecute el script regex.sh

La primera declaración condicional falla porque la expresión regular busca dígitos pero no hay dígitos en el valor contenido en el $words variable de cadena.

El segundo enunciado condicional es exitoso porque el $WordsandNumbers La variable de cadena contiene dígitos.

La declaración condicional final tiene éxito, lo que significa que se resuelve como verdadera, porque la dirección de correo electrónico tiene el formato correcto.

Solo una condición

Las pruebas condicionales de doble paréntesis ofrecen flexibilidad y legibilidad a sus scripts. El solo hecho de poder usar expresiones regulares en pruebas condicionales justifica aprender a usar [[ and ]].

Solo asegúrese de que el script llame a un shell que los admita, como Bash.

RELACIONADO: 15 caracteres especiales que debes conocer para Bash

Descubre más contenido

Subir Change privacy settings