Например, если это мой сценарий:
if [[ $yesno == "What's going on" ]]; then
Тогда как мне сделать так, чтобы он игнорировал '
, ?
, ,
и .
например?
Так что в принципе Whats going on
, What's going on
, What's going on?
и What's going on.
все это будет выглядеть как одно и то же. Я знаю, что могу поставить || [[ $yesno == ".. ]]
для сопоставления несколько переменных, но я не могу напечатать каждую отдельную комбинацию.
решение1
Если вы хотите, чтобы работали только ваши конкретные примеры, вы можете использовать сопоставление регулярных выражений bash
[[ $yesno =~ What\'?s\ going\ on[.?]? ]]
где мы экранируем кавычки и пробелы обратной косой чертой.
решение2
Вы можете просто удалить все символы, кроме буквенно-цифровых, в вашей переменной перед сравнением:
$ yesno="What's going on?"
$ if [[ ${yesno//[^a-zA-Z0-9\ ]/} == "Whats going on" ]]; then echo "OK";fi
OK
решение3
Один из самых распространенных и универсальных способов сделать это — передать строку в конвейер grep
и проверить grep
код возврата. if
Оператор может проверить код выхода любой команды или конвейера:
if echo "$yesno" | grep -q "What'*s *going *on[?.]*"; then
В дополнение к упомянутым вами символам, здесь также допускается 0 или более пробелов между словами.
Эта конструкция должна работать в OS X, FreeBSD, GNU/Linux и любой другой системе, которая поддерживает POSIX grep: