Tak, jest to zamiana wzorca w rozszerzaniu parametrów powłoki, ponieważ:
${parameter/pattern/replacement}
Ale jeśli pierwszy znak po pierwsze /jest albo /albo #albo %ma specjalne znaczenie all(powtórzone), starta end.
z:
$ str='one_#two_two_three_one'
Pojedynczy /zastąpi pierwszą instancję. Pierwsze wystąpienie one:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
Lub pierwsza instancja two:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
Wystąpienie onena końcu:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Wszystkie powtórzenia two:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
Wystąpienie onena początku:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Ciąg rozpoczynający się od #(cytuj #):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Ale jeśli pozostawisz # (niecytowany) w spokoju, zamiana zostanie ustawiona na początku zmiennej:
$ echo "${str/#/====}"
====one_#two_two_three_one
Ponadto, jeśli parametr jest tablicą, zamiana jest wykonywana dla wszystkich elementów:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#i%stanowią część wzorca, podczas gdy//różni się od operatora/i używa tych samych wzorców. Możesz miećpattern='#x'; echo "${var/$pattern}"(lub${var//$pattern}), alepattern=/x; echo "${var/$pattern}"to nie to samo coecho "${var//x}". Zauważ, że#i%można łączyćzsh, ale niebashaniksh.