В bash
3.2 или выше и если совместимость с 3.1 не включена (с опцией compat31
или BASH_COMPAT=3.1
), цитирование операторов регулярных выражений (не только с \
, но и с любым из операторы bash
в кавычках ('...'
, "..."
, $'...'
,$"..."
))лишают их особого смысла.
[[ $var =~ 'OK$' ]]
соответствует только в строках, содержащих OK$
буквально (, где $
соответствует литералу$
)
[[ $var =~ OK$ ]]
соответствует строкам, которые заканчиваются на OK
(, что $
является оператором RE, который соответствует в конце строки ).
Это также относится к регулярным выражениям, хранящимся в переменных, или к результату некоторой замены.
[[ $var =~ $regexp ]] # $var matches $regexp
[[ $var =~ "$string" ]] # $var contains $string
Обратите внимание, что это может стать неудобным, поскольку есть некоторые символы, которые необходимо заключать в кавычки для синтаксиса оболочки (, например пробелы, <
, >
, &
, круглые скобки, если они не совпадают ). Например, если вы хотите сопоставить с .{3} <> [)}]&
regexp (3 символа, за которыми следует " <> "
, )
или }
и &
), вам нужно что-то вроде:
[[ $var =~.{3}" <> "[}\)]\& ]]
Если вы сомневаетесь, какие символы нужно заключать в кавычки, вы всегда можете использовать временную переменную . Это также означает, что он сделает код совместимым с bash31
, zsh
или ksh93
:
.
pattern='.{3} <> [})]&'
[[ $var =~ $pattern ]] # remember *not* to quote $pattern here
Это также единственный способ, (кроме использования compat31
опции (или BASH_COMPAT=3.1
)), вы можете использовать не -расширенные операторы POSIX регулярных выражений вашей системы.
Например, чтобы \<
считалось границей слова, как во многих механизмах регулярных выражений, вам нужно:
pattern='\'
[[ $var =~ $pattern ]]
Делать:
[[ $var =~ \ ]]
не будет работать, так как bash
обрабатывает эти \
как операторы кавычек оболочки и удаляет их перед передачей
в библиотеку регулярных выражений.
Обратите внимание, что в ksh93 все гораздо хуже,:
[[ $var =~ "x.*$" ]]
Например,
будет соответствовать whatever-xa*
, но не whatever-xfoo
. Цитата выше лишает *
особого смысла, но не .
и не $
.
zsh
поведение проще :кавычки не меняют значения операторов регулярных выражений (как в bash31 )что делает поведение более предсказуемым (вместо этого можно использовать регулярные выражения PCRE ЭРЭ (сset -o rematchpcre
)).
yash
не имеет конструкции [[...]]
, но встроенная функция [
имеет оператор =~
(также вzsh
). И, конечно же, [
является обычной командой, поэтому заключение в кавычки не может повлиять на интерпретацию операторов регулярных выражений.
Также обратите внимание, что, строго говоря, ваш $s
содержит не 3 строки, а 2 полные строки, за которыми следует бесконечная строка. Он содержит hello\nworld\nOK
. В расширенном регулярном выражении OK$
оператор $
будет соответствовать только концу строки .
В 3 -полных -строках строка , например hello\nworld\nOK\n
(, которую вы не сможете получить с помощью подстановки команд в виде полос подстановки команд все в конце символов новой строки ), $
будет соответствовать после \n
, поэтому OK$
не будет соответствовать на нем.
Однако с zsh -o pcrematch
$
соответствует как в конце строки, так и перед новой строкой в конце строки, если она есть, поскольку она не передает флаг PCRE_DOLLAR_ENDONLY
в pcre_compile
. Это может показаться плохой идеей, поскольку обычно переменные в оболочках не содержат завершающий символ новой строки, и когда они это делают, мы обычно хотим, чтобы они рассматривались как данные .
Вам может понадобиться SNAT (Source NAT )ваша внутренняя сеть:
-A POSTROUTING -o eth0 -j eth0_masq
-A eth0_masq -s 192.168.158.203/17 -j SNAT --to-source 172.105.89.xxx/24
Где «.89.xxx» — общедоступный IP-адрес, который вы хотели бы использовать из своего диапазона общедоступных IP-адресов для исходящих подключений.
В конце концов я обнаружил, что моя конфигурация в порядке.
Проблема заключалась в том, что провайдер блокировал трафик, чтобы избежать спуфинга.