Tabla de contenido
Una vez más aquí. Esta noche mientras espero que termine el renderizado de un pequeño proyecto con el que ando liado, me he decidido a escribir un artículo que tenía pendiente sobre cómo comparar cadenas en bash. La verdad es que en mi día a día suelo utilizar scripts muy a menudo. En ocasiones los escribo yo y en otras son de otra gente. El caso es que cuando se escriben scripts de Bash, a menudo hay que comparar dos cadenas para comprobar si son iguales o no.
Dos cadenas se consideran iguales cuando tienen la misma longitud y contienen la misma secuencia de caracteres. Como he escrito, en las siguientes líneas vamos a ver cómo comparar cadenas en Bash con lo que quiero completar un poco el artículo que escribí hace algún tiempo sobre cómo realizar comparaciones con Bash Shell Script.
Operadores de comparación
Algo que conviene conocer a la hora de realizar los scripts son los operadores de comparación. Estos son operadores que comparan valores y devuelven verdadero o falso. Cuando comparamos cadenas en Bash, se pueden utilizar los siguientes operadores:
- string1 = string2 y string1 == string2: El operador de igualdad devuelve true si las cadenas son iguales.
- Usa el operador = con la prueba [ comando.
- Usa el operador == con el comando [[ para la coincidencia de patrones.
- string1 != string2: el operador de desigualdad devuelve true si las cadenas no son iguales.
- string1 =~ regex: El operador de expresiones regulares devuelve true si la cadena de la izquierda coincide con la expresión regular de la derecha.
- string1 > string2: El operador mayor que devuelve verdadero si el operador la izquierda es mayor que el de la derecha, ordenado por orden lexicográfico (alfabético).
- string1 < string2: El operador menor que devuelve verdadero si el operando de la derecha es mayor que el de la izquierda, por orden lexicográfico (alfabético).
- -z string: Verdadero si la longitud de la cadena es cero.
- -n string: Verdadero si la longitud de la cadena no es cero.
Lo siguiente que es bueno tener en cuenta al comparar cadenas es:
- Debe usarse un espacio en blanco entre el operador binario y los operandos.
- Utilizar siempre comillas dobles alrededor de los nombres de las variables para evitar cualquier división de palabras o problemas de globos.
- Bash no segrega las variables por ‘tipo’, las variables se tratan como enteros o cadenas según el contexto.
Ejemplos para comparar cadenas utilizando bash
Verifica si las dos cadenas son iguales
En la mayoría de los casos, al comparar cadenas se busca verificar si las cadenas son iguales o no.
La siguiente secuencia de comandos usa la prueba [ comando para verificar si las cadenas son iguales o no con el operador =:
#!/bin/bash VAR1="entreunosyceros" VAR2="entreunosyceros" if [ "$VAR1" = "$VAR2" ]; then echo "Las cadenas son iguales." else echo "Las cadenas NO son iguales." fi
Cuando se ejecuta el script, se imprimirá la salida: Las cadenas son iguales.
Aquí hay otro script que toma la entrada del usuario y compara las cadenas dadas. En este ejemplo, usaremos el [[ comando y ==.
#!/bin/bash read -p "Escribe la primera cadena: " VAR1 read -p "Escribe una segunda cadena: " VAR2 if [[ "$VAR1" == "$VAR2" ]]; then echo "Las cadenas son iguales." else echo "Las cadenas NO son iguales." fi
Al ejecutar el script habrá que escribir las cadenas cuando se le solicite:
Escribe la primera cadena: entreunosyceros Escribe una segunda cadena: sapoclay Las cadenas NO son iguales.
También se pueden utilizar && y o || para comparar las cadenas:
[[ "string1" == "string2" ]] && echo "Iguales" || echo "NO son iguales"
Comprobar si una cadena contiene una subcadena
Como con casi todo, hay varias formas de verificar si una cadena contiene una subcadena.
Un enfoque es rodear la subcadena con símbolos de asterisco *, lo que significa que buscamos que coincidan con todos los caracteres.
#!/bin/bash VAR='Ejemplo de bash publicado en entreunosyceros' if [[ $VAR == *"entreunosyceros"* ]]; then echo "Aquí está!!" fi
El script mostrará de lo siguiente:
Aquí está!!
Otra opción es usar el operador de expresiones regulares = ~ como se muestra a continuación:
#!/bin/bash VAR='Comprar cadenas de texto con bash' if [[ $VAR =~ .*cadenas.* ]]; then echo "Coincidencia encontrada!!" fi
Verifique si una cadena está vacía
Muy a menudo, también podemos necesitar verificar si una variable es una cadena vacía o no. Puedes hacer esto usando los operadores -n y -z.
#!/bin/bash VAR='' if [[ -z $VAR ]]; then echo "La cadena está vacía." fi
Comparación de cadenas con el operador de caso
En lugar de usar los operadores de prueba, también se puede usar la declaración del caso para comparar las cadenas:
#!/bin/bash VAR="Sistema Ubuntu" case $VAR in "Sistema Ubuntu") echo -n "Encontrado" ;; Debian | Lubuntu) echo -n "Red Hat" ;; esac
Comparación lexicográfica
La comparación lexicográfica es una operación en la que dos cadenas se comparan alfabéticamente al comparar los caracteres en una cadena secuencialmente de izquierda a derecha. Este tipo de comparación rara vez se utiliza.
Los siguientes scripts comparan dos cadenas lexicográficamente:
#!/bin/bash VAR1="entreunosyceros" VAR2="Ubuntu" if [[ "$VAR1" > "$VAR2" ]]; then echo "${VAR1} es lexicográficamente mayor que ${VAR2}." elif [[ "$VAR1" < "$VAR2" ]]; then echo "${VAR2} es lexicográficamente mayor que ${VAR1}." else echo "Las cadenas son iguales" fi
La comparación de cadenas es una de las operaciones más básicas y utilizadas en los scripts de Bash. Esto no es más que un pequeño conjunto de TIPS para tenerlo a mano, pero si ayuda a alguien, pues me alegro.