Você pode simplesmente remover todos os caracteres ao lado dos alfanuméricos em sua variável antes da comparação:
$ yesno="What's going on?"
$ if [[ ${yesno//[^a-zA-Z0-9\ ]/} == "Whats going on" ]]; then echo "OK";fi
OK
Por exemplo, se este for o meu script:
if [[ $yesno == "What's going on" ]]; then
Então, como eu faço isso? Ignore '
, ?
, ,
e .
por exemplo?
Então, basicamente, Whats going on
, What's going on
, What's going on?
e What's going on.
parecem ser a mesma coisa. Eu sei que posso colocar || [[ $yesno == ".. ]]
para corresponder a várias variáveis, mas não posso digitar todas as combinações.
Se você quiser que seus exemplos específicos funcionem, use uma correspondência de expressão regular
[[ $yesno =~ What\'?s\ going\ on[.?]? ]]
onde escapamos com barra invertida a citação e os espaços.
Uma das formas mais comuns e universais de fazer isso seria canalizar a string em grep
e verificar o código de retorno de grep
. A instrução if
pode verificar o código de saída de qualquer comando ou pipeline:
if echo "$yesno" | grep -q "What'*s *going *on[?.]*"; then
Além dos caracteres que você mencionou, isso também permite 0 ou mais espaços entre as palavras.
Esta construção deve funcionar no OS X, FreeBSD, GNU / Linux e qualquer outro sistema que forneça o POSIX grep: