Pregunta Cómo comparar cadenas en Bash


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


633
2018-02-10 13:31


origen


Respuestas:


Prueba esto:

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

Si quiere hacer algo cuando no coinciden, reemplace = con !=. Quieres las cotizaciones alrededor $x, porque si $x está vacío, obtendrás if [ = "valid" ]... que es un error de sintaxis


Tenga en cuenta que bash permite == para ser utilizado con [, pero esto no es estándar. Ya sea uso [[ "$x" == "valid" ]] (en cuyo caso, las citas alrededor $x son opcionales) o [ "$x" = "valid" ].


909
2018-02-10 13:34



O bien, si no necesita la cláusula else:

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

102
2018-02-10 13:45



Para comparar cadenas con el uso de comodines

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

51
2018-04-28 14:22



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. Espacios entre if y [ y ] son importantes
  2. > y < son operadores de redireccionamiento así que escaparlo con \> y \< respectivamente para cadenas.

39
2017-08-14 09:08



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

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

No, ese no es un loco delineador

Es solo que parece que uno, hmm, los no iniciados ...

Utiliza patrones comunes como un lenguaje, de alguna manera;

Y después de que aprendiste el idioma.

En realidad, es bueno leer

Es una expresión lógica simple, con una parte especial: evaluación diferida 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 verifica el primero. Si es falso, entonces el segundo operando de la lógica y  && después de que no sea relevante. El primero no es cierto, por lo que no puede ser el primero y el segundo es cierto, 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 por cierto, 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).


21
2018-03-22 13:45



también puedes usar el uso de casos / esac

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

18
2018-02-10 19:58



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

el espacio en bash es tan importante. entonces el siguiente funcionará

[ "$LINE" != "table_name" ] 

pero el siguiente no:

["$LINE" != "table_name"] 

así que por favor use como está:

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

9
2018-06-21 10:57



Probablemente usaría las coincidencias de expresiones regulares si la entrada tiene solo unas pocas entradas válidas. P.ej. solo el "inicio" y "detener" son acciones válidas.

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

Tenga en cuenta que escribo en minúscula la variable $ACTION usando las dobles comas También tenga en cuenta que esto no funcionará en versiones demasiado antiguas de bash.


8
2017-12-04 09:04



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

1
2018-03-22 13:51