Назад | Перейти на главную страницу

bash: Что-то вроде quotemeta () для символов шаблона?

Задний план

Я знаю о различных манипуляции со строками возможности.

Кроме того, я знаю, что могу экранировать символы специального шаблона с помощью обратной косой черты. \.

Например:

# 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"}"