stringContain
variantes (compatível ou independente de maiúsculas e minúsculas)
Como essas respostas do Stack Overflow falam principalmente sobre o Bash , publiquei uma função Bash independente do caso na parte inferior deste post ...
De qualquer forma, existe o meu
Resposta compatível
Como já existem muitas respostas usando os recursos específicos do Bash, existe uma maneira de trabalhar com shells com recursos mais ruins , como o BusyBox :
[ -z "${string##*$reqsubstr*}" ]
Na prática, isso poderia dar:
string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'."
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
done
Isso foi testado em Bash, Dash , KornShell ( ksh
) e ash (BusyBox), e o resultado é sempre:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
Em uma função
Conforme solicitado por @EeroAaltonen, aqui está uma versão da mesma demonstração, testada sob as mesmas conchas:
myfunc() {
reqsubstr="$1"
shift
string="$@"
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'.";
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
}
Então:
$ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.
$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.
Aviso: você precisa escapar ou colocar aspas duplas e / ou aspas duplas:
$ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.
$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.
Função simples
Isso foi testado no BusyBox, Dash e, é claro, no Bash:
stringContain() { [ -z "${2##*$1*}" ]; }
Então agora:
$ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes
... Ou se a string enviada pudesse estar vazia, como apontado por @Sjlver, a função se tornaria:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
ou conforme sugerido pelo comentário de Adrian Günter , evitando -o
interrupções:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Função final (simples):
E invertendo os testes para torná-los potencialmente mais rápidos:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Com cadeias vazias:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Independente de maiúsculas e minúsculas (somente Bash!)
Para testar seqüências de caracteres sem o cuidado de maiúsculas e minúsculas, basta converter cada sequência em minúsculas:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Verifica:
stringContain 'o "M3' 'echo "my string"' && echo yes || echo no
no
stringContain 'o "My' 'echo "my string"' && echo yes || echo no
yes
if stringContain '' ''; then echo yes; else echo no; fi
yes
if stringContain 'o "M' ''; then echo yes; else echo no; fi
no