Как я должен получить Bash 3.2, чтобы найти шаблон между подстановочными знаками - PullRequest
0 голосов
/ 23 февраля 2012

Попытка сравнить ввод с файлом, содержащим слова предупреждения,

read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
# the wildcards in my expression do not work
if [[ $MYINPUT =~ *$X* ]] 
then
    echo  "#1 matched"
else
    echo  "#1 nope"
fi
done

Ответы [ 3 ]

2 голосов
/ 23 февраля 2012

Оператор =~ имеет дело с регулярными выражениями, и поэтому для подстановочного совпадения, как вы хотели, синтаксис будет выглядеть так:

if [[ $MYINPUT =~ .*$X.* ]]

Однако, поскольку это регулярное выражение, это не нужно,поскольку подразумевается, что он может находиться в любом месте строки (если только он не привязан с использованием ^ и / или $, поэтому этого должно быть достаточно:

if [[ $MYINPUT =~ $X ]]

Помните, что если ваши "слова" произойдут ссодержат метасимволы регулярных выражений, тогда это может сделать странные вещи.

1 голос
/ 23 февраля 2012

Я бы избегал =~ здесь, потому что, как указывает FatalError, он будет интерпретировать $X как регулярное выражение, и это может привести к неожиданным ошибкам (особенно потому, что это расширенное регулярное выражение, поэтому в нем больше специальных символов, чемстандартный синтаксис grep).

Вместо этого вы можете просто использовать ==, потому что bash рассматривает RHS == как шаблон сглаживания:

read MYINPUT
alertWords=($(<"AlertWordList"))
for X in "${alertWords[@]}"
do
# the wildcards in my expression do work :-)
if [[ $MYINPUT == *"$X"* ]] 
then
    echo  "#1 matched"
else
    echo  "#1 nope"
fi
done

Я также удалил использованиеcat в вашем назначении alertWords, поскольку он сохраняет чтение файла внутри оболочки, а не порождает другой процесс для этого.

0 голосов
/ 23 февраля 2012

Если вы хотите использовать шаблоны, а не регулярные выражения для сопоставления, вы можете использовать case:

read MYINPUT
alertWords=( `cat "AlertWordList" `)
for X in "${alertWords[@]}"
do
  # the wildcards in my expression do not work
  case "$MYINPUT" in
    *$X* ) echo "#1 matched" ;;
    * ) echo  "#1 nope" ;;
  esac
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...