¿Cómo comparo dos variables de cadena en una statement ‘if’ en Bash?

Estoy tratando de 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 instrucción if , usando [["$s1" == "$s2"]] , con y sin comillas, usando = , == y -eq , pero sigo recibiendo el siguiente error:

[hola: comando no encontrado

He consultado 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?

Solo resolví un poco los espacios …: / ¿Cómo digo que contiene?

Lo intenté

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

pero no funcionó.

Para la comparación de cadenas, use:

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

Para el a contiene b , use:

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

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

malo:

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

bueno:

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

Necesitas espacios:

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

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 salir.

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 envuelven el signo ‘=’.

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

 #!/bin/bash 

o

 #!/bin/sh 

Aquí está la fuente .

Yo sugeriría:

 #!/bin/bash s1="hi" s2="hi" if [ $s1 = $s2 ] then echo match fi 

Sin las comillas dobles y con solo uno igual.

Esta pregunta ya tiene excelentes respuestas, pero aquí parece que hay una ligera confusión entre el uso de igual único y el doble igual en

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

La principal diferencia radica en qué lenguaje de scripting estás usando. Si usa bash , incluya #!/bin/bash en el inicio del script y guárdelo como filename.bash . Para ejecutar usa bash filename.bash – entonces tienes que usar == .

Si está usando sh , use #!/bin/sh y guarde su script como filename.sh . Para ejecutar use sh filename.sh – entonces tiene que usar single = . Evite entremezclarlos.

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

No tengo acceso a un linux box en este momento, pero [es en realidad un progtwig (y un bash incorporado), 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 único =

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

[hola: comando no encontrado

que le muestra que su “hi” ha sido concatenado a “[“.

A diferencia de los lenguajes de progtwigción más tradicionales, en Bash, “[” es un comando como el más obvio “ls” etc. – no se trata especialmente solo porque es un símbolo, de ahí el “[” y el (sustituido) “$ s1 “que están inmediatamente uno al lado del otro en tu pregunta, se unen (como es correcto para Bash) y luego trata de encontrar un comando en esa posición: [hola – que es desconocido para Bash.

En C y en algunos otros idiomas, el “[” se vería como una “clase de carácter” diferente y sería disjunta del siguiente “hola”.

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

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 entre mayúsculas y minúsculas):

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

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

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

Ejemplo 3, marca “sí” en la cadena (distingue entre mayúsculas y minúsculas):

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

Ejemplo 4, marca “sí” en la cadena (distingue entre 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 (sin distinción de 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 dentro 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 

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

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

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