else linux string bash

linux - if else en bash



Cómo comparar cuerdas en Bash (10)

¿Cómo comparo una variable con una cadena (y hago algo si coinciden)?


Usando variables en sentencias if

if [ "$x" = "valid" ]; then echo "x has the value ''valid''" fi

Si quieres hacer algo cuando no coinciden, reemplaza = con != . Puede leer más sobre operaciones de cadenas y operaciones aritméticas en su documentación respectiva.

¿Por qué usamos citas alrededor de $x ?

Deseas las comillas alrededor de $x , porque si está vacío, tu script bash encuentra un error de sintaxis como se ve a continuación:

if [ = "valid" ]; then

Uso no estándar del operador ==

Tenga en cuenta que bash permite que se use == para igualar con [ , pero esto no es estándar .

Utilice el primer caso en el que las citas alrededor de $x son opcionales:

if [[ "$x" == "valid" ]]; then

o utilice el segundo caso:

if [ "$x" = "valid" ]; then


Bash4 + ejemplos. Nota: no usar comillas causará problemas cuando las palabras contengan espacios, etc. Siempre cite en bash IMO.

Aquí hay algunos ejemplos de BASH4 +:

Ejemplo 1, verifique ''sí'' en la cadena (no distingue mayúsculas y minúsculas):

if [[ "${str,,}" == *"yes"* ]] ;then

Ejemplo 2, verifique ''sí'' en la cadena (no distingue mayúsculas y minúsculas):

if [[ "$(echo "$str" | tr ''[:upper:]'' ''[:lower:]'')" == *"yes"* ]] ;then

Ejemplo 3, verifique ''sí'' en cadena (distingue mayúsculas y minúsculas):

if [[ "${str}" == *"yes"* ]] ;then

Ejemplo 4, verifique ''sí'' en la cadena (distingue mayúsculas y minúsculas)

if [[ "${str}" =~ "yes" ]] ;then

Ejemplo 5, coincidencia exacta (distingue entre mayúsculas y minúsculas):

if [[ "${str}" == "yes" ]] ;then

Ejemplo 6, coincidencia exacta (no distingue mayúsculas y minúsculas):

if [[ "${str,,}" == "yes" ]] ;then

Ejemplo 7, coincidencia exacta:

if [ "$a" = "$b" ] ;then

disfrutar.


Lo hice de esta manera que es compatible con bash, dash (sh):

testOutput="my test" pattern="my" case $testOutput in (*"$pattern"*) echo "if there is a match" exit 1 ;; (*) ! echo there is no coincidence! ;;esac


O, si no necesitas otra cláusula:

[ "$x" == "valid" ] && echo "x has the value ''valid''"


Para comparar cadenas con comodines use

if [[ "$stringA" == *$stringB* ]]; then # Do something here else # Do Something here fi


Probablemente use coincidencias de expresiones regulares si la entrada tiene solo unas pocas entradas válidas. Por ejemplo, solo el "inicio" y "detener" son acciones válidas.

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then echo "valid action" fi

Tenga en cuenta que escribo la variable $ACTION usando la coma doble. También tenga en cuenta que esto no funcionará en versiones de bash demasiado antiguas.


También puedes usar case / esac.

case "$string" in "$pattern" ) echo "found";; esac


Tengo que estar en desacuerdo con uno de los comentarios en un punto:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

No, eso no es un oneliner loco

Es solo que parece uno, hmm, el no iniciado ...

Utiliza patrones comunes como lenguaje, en cierto modo;

Y después aprendiste el idioma.

En realidad, es bueno leer

Es una expresión lógica simple, con una parte especial: evaluación perezosa de los operadores lógicos.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

Cada parte es una expresión lógica; El primero puede ser verdadero o falso, los otros dos son siempre verdaderos.

( [ "$x" == "valid" ] && echo "valid" ) || echo "invalid"

Ahora, cuando se evalúa, se comprueba el primero. Si es falso, el segundo operando de la lógica y && después de que no sea relevante. Lo primero no es cierto, por lo que no puede ser lo primero y lo segundo puede ser verdad, de todos modos.
Ahora, en este caso es el primer lado de la lógica o || falso, pero podría ser cierto si el otro lado, la tercera parte, es verdadero.

Entonces, la tercera parte será evaluada, principalmente escribiendo el mensaje como un efecto secundario. (Tiene el resultado 0 para verdadero, que no usamos aquí)

Los otros casos son similares, pero más simples ... ¡y lo prometo! son - pueden ser - fáciles de leer!
(No tengo uno, pero creo que ser un veterano de UNIX con barba gris ayuda mucho con esto).


la siguiente secuencia de comandos lee un archivo llamado "testonthis" línea por línea y luego compara cada línea con una cadena simple, una cadena con caracteres especiales y una expresión regular si no coincide, la secuencia de comandos imprimirá la línea o / w no.

El espacio en bash es muy importante. así que lo siguiente funcionará

[ "$LINE" != "table_name" ]

pero el siguiente no lo hará:

["$LINE" != "table_name"]

así que por favor use como es:

cat testonthis | while read LINE do if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then echo $LINE fi done


a="abc" b="def" # Equality Comparison if [ "$a" == "$b" ]; then echo "Strings match" else echo "Strings don''t match" fi # Lexicographic (greater than, less than) comparison. if [ "$a" /< "$b" ]; then echo "$a is lexicographically smaller then $b" elif [ "$a" /> "$b" ]; then echo "$b is lexicographically smaller than $a" else echo "Strings are equal" fi

Notas:

  1. Los espacios entre if y [ y ] son importantes
  2. > y < son operadores de redireccionamiento, así que escapa con /> y /< respectivamente para cadenas.