Я знаю о различных манипуляции со строками возможности.
Кроме того, я знаю, что могу экранировать символы специального шаблона с помощью обратной косой черты. \
.
Например:
# x is a literal string 'foo*bar'
x="foo*bar"
# prints "*bar".
echo "${x##foo}"
# prints nothing, since the '*' is interpreted as a glob.
echo "${x##foo*}"
# prints "bar", since I escaped the '*'.
echo "${x##foo\*}"
Вышеупомянутое все прекрасно и модно. Проблема в том, что шаблон приходит откуда-то еще и может не иметь *
и другие специальные символы подстановки ускользнули.
Например:
prefix="foo*"
... later, in some faraway code ...
x="foo*bar"
# I want this to print 'bar'. So I want the '*' to be escaped. But how?
echo "${x##$prefix}"
По сути, я ищу что-то аналогичное Perl's quotemeta функция.
Есть ли что-то подобное в bash?
Ах, я понял это сразу после публикации.
Ответ (как всегда): добавьте еще цитат (:
Для моего примера:
prefix="foo*"
... later, in some faraway code ...
x="foo*bar"
# Prints 'bar' since the pattern has double-quotes surrounding it.
echo "${x##"$prefix"}"