У меня есть какое-то регулярное выражение, которое странно ведет себя в моем сценарии оболочки, у меня есть переменные, и я пробовал все способы заставить их вести себя, и они, похоже, не выполняют никаких регулярных выражений, и я довольно хорошо знаю свое регулярное выражение благодаря regex101, вот как выглядит образец

fname="direcheck"
FIND="*"
if [[ $fname =~ $FIND ]]; then
echo "no quotes"
fi

if [[ "$fname" =~ "$FIND" ]]; then
echo "with quotes"
fi

Сейчас он ничего не будет отображать, если я изменю find на

FIND="[9]*"

Тогда он не печатает кавычек, если я говорю

FIND="[a-z]*"

Тогда он не печатает кавычек

Если я говорю

FIND="dircheck"

Тогда ничего не печатает

Если я говорю

FIND="*ck"

Тогда ничего не печатает

Я не понимаю, как работает это регулярное выражение

как использовать эти переменные и каков правильный синтаксис ?

0
Samuel Thompson 24 Фев 2016 в 08:22

2 ответа

Лучший ответ

Я наконец понял это, и почему это так странно работает

[a-z] * и [9] * и [somethinghere] * все они совпадают, потому что они совпадают ноль или более раз. так что "direcheck" имеет [9] ноль или более раз.

Так

 if [[ "$fname" =~ $FIND ]]; then

Или

 if [[ $fname =~ $FIND ]]; then

Оба верны, и

if [[ "$fname" =~ "$FIND" ]]; then

Соответствует только тогда, когда строка совпадает точно, потому что $FIND соответствует буквальной строке, а не регулярному выражению

0
Samuel Thompson 24 Фев 2016 в 14:32
  • * и *ck - недопустимые регулярные выражения. Это сработало бы (без кавычек), если бы вы сравнивали с ==, а не с =~. Если вы хотите использовать для них те же функции, что и в ==, эквивалентные регулярные выражения - .* и .*ck.

  • [9]* - любое количество (включая ноль) символов, которые являются 9. В вашем direcheck нет символов 9, поэтому он совпадает. (Отредактировано из brainfart, спасибо chepner)

  • dircheck не встречается в direcheck, поэтому отсутствие вывода на печать неудивительно.

  • [a-z]* - любое количество символов в диапазоне от a до z (т. Е. Любое количество строчных букв). Это будет соответствовать, если оно не указано в кавычках.

1
Amadan 24 Фев 2016 в 14:27