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.
if echo ... | grep -q ...; then
Você pode usar a
bash
expansão de parâmetro:ou se você quiser uma expressão compatível com Bourne:
$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/
.fonte