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
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
$