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

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

Eu tenho uma string e quero verificar se ela contém a substring ou não. Então estou usando este comando. Abaixo está o script de shell do Linux. Só quero saber como funciona a condição presente na instrução if?

STRING1='This string contains substring.'
if [[ $STRING1 != "${STRING1/substr/}" ]]; then
  echo "Substring is present"
fi

Responder1

Essa é uma maneira complicada e específica do ksh (embora agora suportada por alguns outros shells) de escrever o padrão:

case $STRING1 in
   *substr*) echo Substring is present
esac

Ou específico do ksh:

if [[ $STRING1 = *substr* ]]; then
  echo Substring is present
fi

${var/pattern/replacement}é um operador de expansão de parâmetro ksh que se expande para o valor $varonde a primeira ocorrência de patternfoi substituída por replacement.

O mesmo ${STRING1/substr/}acontece $STRING1com a primeira ocorrência de substrsubstituído por nada, então removido.

[[ string = pattern ]]e [[ string != pattern ]]são outra construção específica do ksh que compara a string com um padrão. Quando o padrão é citado, ele é interpretado literalmente, assim como [[ string = "string" ]]um operador de igualdade (e desigualdade com !=).

Portanto, o [[ $STRING1 != "${STRING1/substr/}" ]]comando retorna verdadeiro se a expansão de $STRING1e ${STRING!/substr/}produzir strings diferentes, o que só pode acontecer se houver pelo menos uma ocorrência de substrinside $STRING1, portanto é uma forma de verificar se $STRING1contém substr.

Embora nem [[...]]sejam sintaxe ${var/pattern/replacement}padrão , o comando e o operador (este último também vindo do ksh) são padrão. Às vezes você vê códigos como:sh[${var#pattern}

if [ "$STRING1" != "${STRING1#*substr*}" ]; then
  echo Substring is present
fi

Qual é uma maneira padrão (embora não Bourne) de verificar se uma variável contém uma substring, mas novamente é complicada e não tem vantagem sobre a caseabordagem óbvia de declaração.

Responder2

verifique se contém a substring

Parece mais simples de executar

[ -z "${s##*substr*}" ] && echo Substring is present

O resultado da expansão ${…}é nulo (comprimento zero) se substrestiver presente.


... como funciona a condição presente na instrução if? O

if [[ $STRING1 != "${STRING1/substr/}" ]]; then

Está comparando duas strings, a original não modificada e a mesma string substrremovida ( /substr/}). Se forem diferentes ( !=), a string original contém substr.

informação relacionada