в доступе отказано, даже если у меня есть разрешение

В операторе соответствия 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

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

  1. используйте \"и еще один \"вместо \Q и \E в Perl
  2. вставьте всю тестовую команду в тщательно процитированныйeval

Все это нужно для того, чтобы расширить строку, содержащую регулярное выражение first , чтобы два "в переменной оболочки считались началом -концом литеральной части регулярного выражения, а не чем обычные символы кавычек Bash, а затем вся операция сопоставления выполняется по такому результирующему шаблону.

(Более сложная задача возникает, когда вам нужно включить двойные -кавычки или обратную косую черту внутри регулярного выражения внутри переменной оболочки с двойными -кавычками..)

В качестве примечания -на самом деле вам не нужны .*в начале и конце регулярного выражения, потому что они обычно подразумеваются в операции регулярного выражения Bash. На самом деле вам скорее нужно явно указать начальные -конечные привязки(^и $), когда вы не хотите подразумевать другие символы до и после регулярного выражения.

1
25.05.2020, 00:13
1 ответ

Не существует «хорошего» (т.е. соответствующего всем соответствующим стандартам )способа достижения желаемого здесь (показа только некоторых, но не всего содержимого (метаданных )каталог ).

Но ядро ​​сообщает вам, что у вас нет разрешений на этот объект, если вы спросите об этом:

$ test -r /proc/2072/exe ; echo $?
1
$ test -w /proc/2072/exe ; echo $?
1
$ test -x /proc/2072/exe ; echo $?
1
1
18.03.2021, 23:33

Теги

Похожие вопросы