y = $ (expr "$ str": ". * $ x" - length "$ x")
кто-нибудь может объяснить этот фрагмент кода.
Я новичок в написании сценариев и имею некоторый опыт работы с C ++ и python.
На самом деле этот вопрос был частью моего комментария к одному из моих предыдущих вопросов, но я я не получаю никаких ответов.
Выражение expr
"$str" : ".*$x"
является регулярным выражением. Общая форма такова
expr STRING : REGEXP
где REGEXP
- это привязанное регулярное выражение - "привязанное" означает, что оно пытается соответствовать REGEX
, начиная с первого символа STRING
, поэтому для соответствия $x
в любом месте $str
вам нужно что-то вроде . *
, чтобы перебрать все символы от якоря до начала $x
Результатом является длина совпадающего шаблона - сюда входит все, что совпало с .*
, а также все, что совпало с $x
. Таким образом,
expr "$str" : ".*$x" - length "$x"
возвращает начальный индекс совпадения $x
в $str
, или минус длина $x
, если совпадение не найдено. Например:
$ expr foobarbaz : ".*bar" - length bar
3
$ expr foobar : ".*baz" - length baz
-3
Обратите внимание, что хотя вы можете "использовать expr
со строками", на самом деле он будет интерпретировать $x
как регулярное выражение (GNU basic) - поэтому будьте осторожны, если оно содержит что-либо кроме буквенно-цифровых символов.