Có, nó là một sự thay thế mẫu trong việc mở rộng tham số shell như:
${parameter/pattern/replacement}
Nhưng nếu ký tự đầu tiên sau ký tự đầu tiên /
là /
hoặc #
hoặc %
nó có ý nghĩa đặc biệt của all
(lặp lại) start
và end
.
với:
$ str='one_#two_two_three_one'
Một đơn /
sẽ thay thế phiên bản đầu tiên. Trường hợp đầu tiên của one
:
$ echo "${str/one/x-x}"
x-x_#two_two_three_one
Hoặc ví dụ đầu tiên của two
:
$ echo "${str/two/x-x}"
one_#x-x_two_three_one
Ví dụ one
ở cuối:
$ echo "${str/%one/x-x}"
one_#two_two_three_x-x
Tất cả sự lặp lại của two
:
$ echo "${str//two/x-x}"
one_#x-x_x-x_three_one
Ví dụ one
khi bắt đầu:
$ echo "${str/#one/x-x}"
x-x_#two_two_three_one
Một chuỗi bắt đầu bằng #
(trích dẫn #
):
$ echo "${str/\#two/x-x}"
one_x-x_two_three_one
Nhưng nếu bạn để số # (không trích dẫn), thay thế được đặt ở đầu biến:
$ echo "${str/#/====}"
====one_#two_two_three_one
Hơn nữa, nếu tham số là một mảng, việc thay thế được thực hiện trên tất cả các phần tử:
$ str=( one two three )
$ echo "${str[@]/#/==}"
==one ==two ==three
#
và%
là một phần của mẫu trong khi//
là một toán tử khác/
và sử dụng cùng một mẫu. Bạn có thể cópattern='#x'; echo "${var/$pattern}"
(hoặc${var//$pattern}
), nhưngpattern=/x; echo "${var/$pattern}"
không giống nhưecho "${var//x}"
. Lưu ý rằng#
và%
có thể được kết hợp trongzsh
, nhưng không phảibash
cũng khôngksh
.