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) startvà 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ụ onekhi 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ảibashcũng khôngksh.