$STRING1 != "${STRING1/substr/}" en Linux

$STRING1 != "${STRING1/substr/}" en Linux

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ó $varla primera aparición de .patternreplacement

Lo mismo ${STRING1/substr/}ocurre $STRING1con la primera aparición de substrreemplazado 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 $STRING1y ${STRING!/substr/}produce cadenas diferentes, lo que solo puede suceder si hubo al menos una aparición de substrinside $STRING1, por lo que es una forma de verificar que $STRING1contiene 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 caseenfoque 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 substrestá 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 substreliminar ( /substr/}). Si son diferentes ( !=), la cadena original contenía substr.

información relacionada