Абсолютно никаких. Нет никакой причины использовать обратные кавычки в этом месте кода. И обратные кавычки в целом следует заменить на $(...)
, который лучше вкладывается и интуитивно обрабатывает цитирование.
Серьезно. Не пишите такой код.
Я вижу, откуда это могло взяться:
эхо
, чтобы «сделать это безопасным». Это позволило увидеть, какие команды будут выполнятьсябез риска перезаписать что-либо при тестировании. (Хорошая вещь)Смежный вопрос: Когда следует использовать $( ) в определении переменных
Используйте:
REGEXP='^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$'
Для выбора нужных символов. То, что соответствует [a-z]
, гарантированно будет [abcdefghijkmnopqrstuvwxyz]
только в локали C/POSIX.
(Я предполагаю, что вы не хотите включать обратную косую черту, но это \
было ошибочной попыткой избежать-
).
Другим вариантом является исправление языкового стандарта C перед использованием инструмента, который оценивает это ^[a-zA-Z0-9-]+$
расширенное регулярное выражение (или ^[[:alnum:]-]+$
), например:
LC_ALL=C grep -Ee "$REGEXP"
Это допустимо в данном случае, но не в таких случаях, как REGEXP='[A-Z]'
, если данные для сопоставления с регулярным выражением находятся в кодировке, такой как BIG5 -HKSCS или GB18030 (, и в локалях, которые используют тот же символ ), где многие символы имеют кодировку, содержащую ту же кодировку, что и A-Z
.
Пример, где [A-Z]
соответствуетÁ
(U+00C1,кодируется как 0x88 0x57 в BIG5 -HKSCS (, где 0x57 такжеW
)):
$ LC_ALL=zh_HK.big5hkscs REGEXP='[A-Z]' bash -c 'printf "\uc1\n" |
LC_ALL=C grep -qe "$REGEXP" && echo match'
match