Sim, é uma substituição de padrão na expansão de parâmetros do shell como:
${parameter/pattern/replacement}
Mas se o primeiro caractere após o primeiro /for /ou #ou %tiver o significado especial de all(repetido) starte end.
com:
$ str='one_#two_two_three_one'
Um único /substituirá a primeira instância. A primeira instância de one:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
Ou a primeira instância de two:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
A instância de oneno final:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Todas as repetições de two:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
A instância de oneno início:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Uma sequência que começa com #(aspas #):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Mas se você deixar o # (não citado) sozinho, a substituição será configurada no início da variável:
$ echo "${str/#/====}"
====one_#two_two_three_one
Além disso, se o parâmetro for uma matriz, a substituição será feita em todos os elementos:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#e%fazem parte do padrão, enquanto//é um operador diferente/e usar os mesmos padrões. Você pode terpattern='#x'; echo "${var/$pattern}"(ou${var//$pattern}), maspattern=/x; echo "${var/$pattern}"não é o mesmo queecho "${var//x}". Observe que#e%pode ser combinadozsh, mas nãobashnemksh.