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 como em uma declaração case
.
Também é possível usar correspondência regex POSIX:
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 da compatibilidade sh :
case $longstring in
*mystr*)
echo yes;;
*"$matchstr"*)
echo yes again!;;
*)
echo no;;
esac
Como alternativa, se você estiver abusando do idioma:
if case $longstring in
*mystr*) true;;
*"$matchstr"*) true;;
*) false;;
esac; then
...
fi
(Este if / case / esac / then form na verdade é útil em algumas situações, como ao criar uma whitelist / blacklist incremental.)
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 uma regex ancorada (como grep, mas sempre com um ^
prefixado). Portanto, tenha cuidado ao passar uma variável como correspondência.