Respostas:
Use correspondência de caractere curinga. Para bash especificamente:
if [[ $longstring == *mystr* ]]; then
if [[ $longstring == *"my string"* ]]; then
if [[ $longstring == *"$matchstr"* ]]; then
No [[
operador, o lado esquerdo é expandido literalmente (isto é, sem a necessidade de aspas duplas), enquanto as partes não nomeadas do lado direito são tratadas como curingas - basicamente as mesmas regras de cotação que em uma case
instrução.
É possível usar a correspondência regex POSIX também:
if [[ $longstring =~ mystr ]]; then
if [[ $longstring =~ "my string" ]]; then
if [[ $longstring =~ "$matchstr" ]]; then
Novamente, as partes citadas do lado direito são correspondidas literalmente, enquanto as partes não citadas são correspondidas como operadores regex.
Se você precisar de compatibilidade sh :
case $longstring in
*mystr*)
echo yes;;
*"$matchstr"*)
echo yes again!;;
*)
echo no;;
esac
Alternativamente, se você estiver abusando do idioma:
if case $longstring in
*mystr*) true;;
*"$matchstr"*) true;;
*) false;;
esac; then
...
fi
(Este if / case / esac /, em seguida, formulário é realmente útil em algumas situações, como quando se faz uma lista de desbloqueio / blacklist.)
Versão mais curta:
if ! case $longstring in *"$matchstr"*) !; esac; then
echo "It matched!"
fi
Muitos scripts sh usam, expr
mas não é um shell embutido, portanto, um pouco mais lento:
if expr match "$longstring" ".*mystr"; then
...
fi
Neste caso (como expr não pode ver diferenças na cotação), o parâmetro "match" inteiro é interpretado como um regex ancorado (como grep mas sempre com um ^
prefixo). Portanto, tenha cuidado ao passar uma variável como a correspondência.
Isso fará isso:
#! /bin/bash
X=`echo "a long string with mystring in it" | grep "mystr" | wc -l`
if [ $X -gt 0 ]
then
echo "found string";
fi
A idéia aqui é que "echo" configura a string, grep procura pela substring na string passada para ela, e wc -l retorna o número de linhas em que a string foi encontrada - então, 0 ou 1.
if echo ... | grep -q ...; then
Você pode usar a bash
expansão de parâmetro:
if [ "${TestString/$SearchString/}" == "$TestString" ]; then echo Found; fi
ou se você quiser uma expressão compatível com Bourne:
if [ "${TestString#*$SearchString}" == "$TestString" ]; then echo Found; fi
$SearchString
pode ser um literal: pode conter espaços, seja um literal ou uma variável, e uma variável pode conter }
, mas em um literal deve ser escapado como \}
. Na primeira forma, a mesma consideração também se aplica a /
.