Ignorar certos caracteres ao comparar variáveis?

Ignorar certos caracteres ao comparar variáveis?

Por exemplo, se este for o meu script:

if [[ $yesno == "What's going on" ]]; then

Então, como faço para ignorar ', e ?, por exemplo?,.

Então, basicamente Whats going on, What's going on, What's going on?e What's going on.parecem todos a mesma coisa. Eu sei que posso || [[ $yesno == ".. ]]combinar múltiplas variáveis, mas não consigo digitar todas as combinações.

Responder1

Se você quiser apenas que seus exemplos específicos funcionem, você pode usar uma correspondência bash regexp

[[ $yesno =~ What\'?s\ going\ on[.?]? ]]

onde escapamos com barra invertida a citação e os espaços.

Responder2

Você pode simplesmente remover todos os caracteres além 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

Responder3

Uma das maneiras mais comuns e universais de fazer isso seria canalizar a string grepe verificar grepo código de retorno de . A ifinstrução 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, 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 grep POSIX:

informação relacionada