В операторе соответствия Bash =~
литеральные строки в регулярном выражении можно указать, заключив их в двойные -кавычки.
Таким образом, теоретически вам просто нужно превратить \Q и \E в Perl в одну двойную -кавычку.
Но, однако, если вам требуется использовать регулярное выражение, которое частично является переменным (, т. е. содержит другие переменные оболочки, подлежащие раскрытию )и частично литералом, и которое само содержится в переменной оболочки, тогда я Боюсь, единственный выход — также использовать eval
.
То есть ваш примерный код станет таким:
strFilenameOnDB="some ( file ) name +.ok";
strFilenameToCheck="$strFilenameOnDB"; #code simplification
strRegex=".*\"${strFilenameToCheck}\".*"; # <<--- note the backslash before each _inner_ double-quote: this is Bash’s syntax to embed a literal double-quote in a string _made by_ double-quotes
# then we shall use eval on the whole test operation
if eval '[[ "${strFilenameOnDB}" =~ '"${strRegex}"' ]]';then echo OK;fi
# or, using a fine Bash’s shortcut:
eval '[[ "${strFilenameOnDB}" =~ '"${strRegex}"' ]]' && echo OK
Подводя итог,чтобы внедрить литеральные строки в частично переменное регулярное выражение, содержащееся в переменной оболочки, вам нужно:
\"
и еще один \"
вместо \Q и \E в Perl eval
Все это нужно для того, чтобы расширить строку, содержащую регулярное выражение first , чтобы два "
в переменной оболочки считались началом -концом литеральной части регулярного выражения, а не чем обычные символы кавычек Bash, а затем вся операция сопоставления выполняется по такому результирующему шаблону.
(Более сложная задача возникает, когда вам нужно включить двойные -кавычки или обратную косую черту внутри регулярного выражения внутри переменной оболочки с двойными -кавычками..)
В качестве примечания -на самом деле вам не нужны .*
в начале и конце регулярного выражения, потому что они обычно подразумеваются в операции регулярного выражения Bash. На самом деле вам скорее нужно явно указать начальные -конечные привязки(^
и $
), когда вы не хотите подразумевать другие символы до и после регулярного выражения.
Не существует «хорошего» (т.е. соответствующего всем соответствующим стандартам )способа достижения желаемого здесь (показа только некоторых, но не всего содержимого (метаданных )каталог ).
Но ядро сообщает вам, что у вас нет разрешений на этот объект, если вы спросите об этом:
$ test -r /proc/2072/exe ; echo $?
1
$ test -w /proc/2072/exe ; echo $?
1
$ test -x /proc/2072/exe ; echo $?
1