Cómo utilizar pruebas condicionales de doble corchete en Linux

Las pruebas condicionales ramifican el flujo de ejecución de scripts de Linux Bash de acuerdo con el resultado de una expresión lógica. Las pruebas condicionales de doble corchete simplifican la sintaxis considerablemente, pero aún tienen sus propias trampas.

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"

Las pruebas condicionales de un solo corchete imitan las test mando. Envuelven la expresión entre corchetes “[ ]“Y funcionan 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 ]] son palabras clave. [[ and ]] También realizan pruebas lógicas, pero su sintaxis es diferente. Debido a que son palabras clave, puede usar algunas características interesantes que no funcionarán en la versión de un solo corchete.

Las palabras clave de doble corchete son compatibles con Bash, pero no están disponibles en todos los demás shell. Para example, el caparazón de Korn los soporta, pero el viejo caparazón, 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.

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

Integrados y palabras clave

Podemos usar el compgen programa para enumerar las incorporaciones:

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 las incorporaciones agrupadas en un párrafo.

Listado de las funciones integradas de Bash

Podemos ver test y [ in the list, but ] no aparece 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 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 ]] es otro. Son un par combinado, como if y fi , y case y esac .

Cuando Bash analiza un script (o una línea de comando) y detecta una palabra clave que tiene una palabra clave de cierre coincidente, reúne todo lo que aparece entre ellos y aplica cualquier tratamiento especial que admitan las palabras clave.

Con un comando incorporado, lo que sigue al comando incorporado se le pasa exactamente como los parámetros de cualquier otro programa de línea de comandos. Esto significa que el autor del script debe tener especial cuidado con respecto a cosas como los espacios en los valores de las variables.

Globbing de caparazón

Las pruebas condicionales de doble corchete pueden hacer uso de shell globbing. Esto significa que 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 que el script sea ejecutable, necesitaremos usar el chmod comando con el -x (ejecutar) opción. Deberá hacer esto con todos los scripts de este artículo si desea probarlos.

chmod +x whelkie.sh

Usando 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 envolvemos la cadena de búsqueda entre comillas dobles. Si lo hace, el globbing no sucederá. 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. Para example, si no sabe qué caso utilizar, puede cubrir ambas eventualidades con un rango.

#!/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 declaración condicional se resuelve como verdadera y se ejecuta la primera cláusula de la declaración if.

./damme.sh

Ejecutando el script damme.sh

Cotizaciones de cadenas

Anteriormente mencionamos envolver cadenas entre comillas dobles. Si lo hace, no se producirá el globbing de caparazón. Aunque la convención dice que es una buena práctica, no es necesario envolver las variables de cadena entre comillas al usar [[ and ]]incluso si contienen espacios. Mira el siguiente example. Ambos $stringvar y $surname las variables de cadena contienen espacios, pero ninguna se cita 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


Guarde esto en un archivo llamado “apellido.sh” y hágalo ejecutable. Ejecútelo usando:

./surname.sh

Ejecutando el script surname.sh

A pesar de que ambas cadenas contienen espacios, el script tiene éxito 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 propia computadora, guarde el texto en un archivo llamado “dir.sh” y hágalo ejecutable, puede ver que esto funciona.

./dir.sh

Ejecutando el script dir.sh

Cómo trabajar con variables en Bash

Nombre de archivo Globbing Gotchas

Una diferencia interesante entre [ ] y [[ ]] se relaciona con los nombres de archivo que contienen globbing. La forma “* .sh” coincidirá con todos los archivos de secuencia de comandos. Usando corchetes simples [ ] falla a menos que haya un solo archivo de secuencia de comandos. Encontrar más de un script arroja un error.

Aquí está el guión con condicionales de un solo corchete.

#!/bin/bash

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

Guardamos este texto en “script.sh” y lo hicimos 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 causa ningún error. La edición de la secuencia de comandos para utilizar corchetes dobles 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

Guardamos esto en un archivo llamado “dscript.sh” y lo hicimos ejecutable. Ejecutar esta secuencia de comandos en un directorio con muchas secuencias de comandos no arroja un error, pero la secuencia de comandos no reconoce ningún archivo de secuencia de comandos.

La declaración condicional que usa corchetes dobles solo se resuelve como verdadera en el improbable caso de que tenga un archivo llamado “* .sh” en el directorio.

./dscript.sh

Ejecutando el script dscript.sh

AND lógico y OR

Los soportes dobles te permiten usar && y || como los operadores lógicos AND y OR.

Este script debería resolver la declaración condicional como verdadera porque 10 es igual a 10 y 25 es menor 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 sigue siendo menor que 26. Siempre que la primera comparación o la segunda comparación sean verdaderas, el enunciado condicional como un todo se resuelve como 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

Expresiones regulares

Las declaraciones condicionales de doble corchete permiten el uso de la =~ operador, que aplica los 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 coincidencias, la declaración condicional se resuelve como falsa.

Cómo usar expresiones regulares (regexes) 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]"

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 corchetes dobles usa la variable de cadena $mask1 como la expresión regular. Contiene el patrón para todos los dígitos en el rango de cero a nueve. Aplica esta expresión regular a la $words variable de cadena.

El segundo conjunto de corchetes dobles usa nuevamente la variable de cadena $mask1 como la expresión regular, pero esta vez lo usa con la $WordsandNumbers variable de cadena.


El último conjunto de corchetes 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 “+“Fuera de”[]”Significa repetir esas coincidencias para todos los caracteres que encuentre.
  • @: Esto solo coincide 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 un guión. El “+“Fuera de”[ ]”Significa repetir esas coincidencias para todos los caracteres que encuentre.
  • .: Coincide con el “.” solo personaje.
  • [A-Za-z]{2,4}: Coincide con cualquier letra mayúscula o minúscula. El “{2,4}”Significa coincidir con al menos dos caracteres y como máximo cuatro.

Poniendo todo eso 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

Ejecutando el script regex.sh

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

La segunda declaración condicional tiene éxito porque el $WordsandNumbers La variable de cadena contiene dígitos.


La declaración condicional final tiene éxito, es decir, se resuelve como verdadera, porque la dirección de correo electrónico está formateada correctamente.

Solo una condición

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

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

15 personajes especiales que debes conocer para Bash

Related Posts