Tengo una cadena y quiero comprobar si contiene la subcadena o no. Entonces estoy usando este comando. A continuación se muestra el script de shell de Linux. Solo quiero saber cómo funciona la condición presente en la declaración if.
STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
echo "Substring is present"
fi
Respuesta1
Esa es una forma complicada y específica de ksh (aunque ahora compatible con algunos otros shells) de escribir el estándar:
case $STRING1 in
*substr*) echo Substring is present
esac
O específico de ksh:
if [[ $STRING1 = *substr* ]]; then
echo Substring is present
fi
${var/pattern/replacement}
es un operador de expansión de parámetros ksh que se expande hasta el valor donde se reemplazó $var
la primera aparición de .pattern
replacement
Lo mismo ${STRING1/substr/}
ocurre $STRING1
con la primera aparición de substr
reemplazado con nada, por lo que se elimina.
[[ string = pattern ]]
y [[ string != pattern ]]
son otra construcción específica de ksh que compara una cadena con un patrón. Cuando se cita el patrón, se toma literalmente, al igual que [[ string = "string" ]]
un operador de igualdad (y desigualdad con !=
).
Entonces, el [[ $STRING1 != "${STRING1/substr/}" ]]
comando devuelve verdadero si la expansión de $STRING1
y ${STRING!/substr/}
produce cadenas diferentes, lo que solo puede suceder si hubo al menos una aparición de substr
inside $STRING1
, por lo que es una forma de verificar que $STRING1
contiene substr
.
Si bien ni [[...]]
ni son sintaxis ${var/pattern/replacement}
estándar , el comando y el operador (este último también proviene de ksh) son estándar. Entonces a veces ves código como:sh
[
${var#pattern}
if [ "$STRING1" != "${STRING1#*substr*}" ]; then
echo Substring is present
fi
Que es una forma estándar (aunque no Bourne) de comprobar que una variable contiene una subcadena, pero nuevamente es complicada y no tiene ninguna ventaja sobre el case
enfoque de declaración obvio.
Respuesta2
compruebe si contiene la subcadena
Parece más sencillo de ejecutar
[ -z "${s##*substr*}" ] && echo Substring is present
El resultado de la expansión ${…}
es nulo (longitud cero) si substr
está presente.
... ¿cómo funciona la condición presente en la declaración if? El
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
Está comparando dos cadenas, la original sin modificar y la misma cadena sin substr
eliminar ( /substr/}
). Si son diferentes ( !=
), la cadena original contenía substr
.