strings script manejo equal ejemplos comparar cadenas bash if-statement scripting

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



manejo de cadenas en shell script (12)

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


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


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


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.


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


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 =


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 .


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 .


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


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