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 $var
onde a primeira ocorrência de pattern
foi substituída por replacement
.
O mesmo ${STRING1/substr/}
acontece $STRING1
com a primeira ocorrência de substr
substituí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 $STRING1
e ${STRING!/substr/}
produzir strings diferentes, o que só pode acontecer se houver pelo menos uma ocorrência de substr
inside $STRING1
, portanto é uma forma de verificar se $STRING1
conté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 case
abordagem ó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 substr
estiver 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 substr
removida ( /substr/}
). Se forem diferentes ( !=
), a string original contém substr
.