Я написал себе программу для Linux, program
которая нуждается в регулярном выражении в качестве входных данных.
Я хочу вызвать программу в bash
оболочке и передать это регулярное выражение в качестве аргумента командной строки программе (есть и другие аргументы командной строки). Типичное регулярное выражение выглядит как
[abc]\_[x|y]
К сожалению , символы [
, ]
и |
специальные символы в bash
. Таким образом, призывая
program [abc]\_[x|y] anotheragument
не работает Есть ли способ передать выражение с помощью каких-либо escape-символов или кавычек и т. Д.?
(Вызов также program "[abc]\_[x|y] anotheragument"
не работает, потому что он интерпретирует два аргумента как один.)
источник
"$HOME"
или параметров"${USER:-root}"
, подстановку команд в форме"$(date)"
или"`date`"
арифметическое расширение"$((1 + 2))"
, расширение истории"!!"
или экранирование обратной косой черты"\\"
. Вместо этого используйте одинарные кавычки. См. Справочную страницу руководства по bash, раздел «Цитирование».Используйте одинарные кавычки. Одинарные кавычки гарантируют, что ни один из символов не будет интерпретирован.
Есть два решения, если вам нужно вставить одну цитату:
источник
в
man bash
источник
Вы можете использовать обратную косую черту (
\
) перед специальными символами, чтобы экранировать их следующим образом:источник
Хотя это может быть бесполезно в качестве регулярного выражения, некоторые последовательности символов могут интерпретироваться как имена переменных Bash. Чтобы предотвратить это и избежать их расширения, используйте одинарные кавычки вместо двойных кавычек:
Цитируйте каждый аргумент отдельно (если они нуждаются в цитировании), чтобы они интерпретировались как независимые аргументы Вы также можете использовать массивы в некоторых случаях:
источник
источник
Побег из них должен работать нормально:
источник
Откуда взялся этот паттерн? Это исправлено или от пользователя? Это пользователь, который вызывает скрипт в локальной системе, или кто-то удаленный?
Вы используете кавычки для переноса данных, чтобы оболочка не интерпретировала их. Есть два варианта:
Поскольку
$
в регулярных выражениях допустимый символ (конец строки / буфер), вы, вероятно, захотите использовать одинарные кавычки для хранения регулярного выражения, если только вы не храните в переменной. Если вы принимаете произвольные данные от кого - то ненадежного, вам необходимо заменить'
с ,'"'"'
а затем завернуть в одинарных кавычках.Обратите внимание, что
[abc]_[x|y]
похоже, что вы хотите соответствоватьx
илиy
, в то время как это на самом деле соответствует одному из трех символовxy|
. Квадратные скобки соответствуют символам внутри и только-
для диапазонов и a^
в начале для отрицания. Таким образом, это[abc]_(x|y)
может быть то, что вы имели в виду, а круглые скобки - это символы, которые являются специальными для оболочки. Квадратные скобки не являются особенными для оболочки, это выглядит так, как будто они есть. Двойные квадратные скобки[[ ... ]]
являются специальными.источник
'
на'"'"'
), однако он все еще не верен.[
Это специальный символ для оболочки, он используется в подстановочных знаках при расширении пути (что делает оболочку для всего, что не заключено в кавычки).foo=a[b]
а затемecho $foo
и увидеть, что строка не нуждается в кавычках. Вы правы, я был слишком краток.ab
в текущем каталоге есть файл , которыйfoo
будет содержатьab
вместоa[b]
. Процитируйте свои квадратные скобки, люди.setopt glob_assign
включить это поведение, так что цитирование - самый безопасный ответ.