if-statement comparar - ¿Cómo comparo dos variables de cadena en una declaración 'if' en Bash?




script text (11)

Sugiero este:

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

Observe el espacio en blanco entre los corchetes de apertura / cierre y las variables y también los espacios en blanco que encierran el signo '='.

Además, tenga cuidado con el encabezado de su script. No es lo mismo si usas

#!/bin/bash

o

#!/bin/sh

Aquí está la fuente .

Estoy intentando obtener una sentencia if para trabajar en Bash (usando Ubuntu ):

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

He intentado varias formas de la declaración if , usando [["$s1" == "$s2"]] , con y sin comillas, usando = , == y -eq , pero todavía recibo el siguiente error:

[hola: comando no encontrado

He mirado en varios sitios y tutoriales y los he copiado, pero no funciona. ¿Qué estoy haciendo mal?

Eventualmente, quiero decir si $s1 contiene $s2 , entonces, ¿cómo puedo hacer eso?

Acabo de trabajar en los espacios ...: / ¿Cómo digo que contiene?

Lo intenté

if [[ "$s1" == "*$s2*" ]]

pero no funcionó.


Yo sugeriría:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

Sin las comillas dobles y con un solo igual.


Para una versión con Bash puro y sin test , pero realmente fea, intente:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

Explicación: En ( ) se abre una subshell extra. Sale con 0 si hubo una coincidencia, e intenta salir con $ s1 si no hubo una coincidencia que genere un error (feo). Este error se dirige a /dev/null .


Necesitas espacios:

if [ "$s1" == "$s2" ]

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

#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

Agregar una cadena adicional en el interior lo hace más seguro.

También puede usar otra notación para comandos de una sola línea:

[ "x$s1" == "x$s2" ] && echo match

Debe tener cuidado de dejar un espacio entre el signo de '[' y las comillas dobles donde la variable contiene esto:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

Los ^ s muestran los espacios en blanco que necesita para dejar.


Para comparar cadenas, use:

if [ "$s1" == "$s2" ]

Para la a contiene b , usa:

if [[ $s1 == *"$s2"* ]]

(y asegúrese de agregar espacios entre los símbolos):

malo:

if ["$s1" == "$s2"]

bueno:

if [ "$s1" == "$s2" ]

¡Esto es más aclaración que respuesta! Sí, la pista está en el mensaje de error:

[hola: comando no encontrado

lo que te muestra que tu "hola" ha sido concatenado a la "[".

A diferencia de los lenguajes de programación más tradicionales, en Bash, "[" es un comando como el "ls" más obvio, etc. - no se trata especialmente porque es un símbolo, por lo tanto, "[" y el (sustituido) "$ s1 "que están inmediatamente uno al lado del otro en su pregunta, se unen (como es correcto para Bash) y luego intenta encontrar un comando en esa posición: [hi - lo cual es desconocido para Bash.

En C y en algunos otros idiomas, "[" se vería como una "clase de caracteres" diferente y se separaría de la siguiente "hola".

Por lo tanto, necesita un espacio después de la apertura "[".


No tengo acceso a una caja de Linux en este momento, pero [en realidad es un programa (y un bash builtin), así que creo que tienes que poner un espacio entre [y el primer parámetro.

También tenga en cuenta que el operador de igualdad de cadenas parece ser un solo =


Esto funcionó para mí:

string="1;2"
echo $string | cut -d';' -f1 # output is 1
echo $string | cut -d';' -f2 # output is 2




bash if-statement scripting