strings - string equal bash




¿Cómo comparo dos variables de cadena en una declaración 'if' en Bash? (8)

¡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 "[".

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


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

Esta pregunta ya tiene grandes respuestas, pero aquí parece que hay una ligera confusión entre el uso de simples iguales y dobles iguales en

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

La principal diferencia radica en qué lenguaje de scripting está utilizando. Si está usando bash , incluya #!/bin/bash en el inicio del script y guarde su script como filename.bash . Para ejecutar use bash filename.bash , entonces tiene que usar == .

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


Necesitas espacios:

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

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" ]

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 .


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.


#!/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




scripting