Loại hoạt động nào là / # / - trong phiên bản $ {my_array [@] / # / -}?


17

Câu trả lời được chấp nhận để chuyển đổi một mảng thành đối số của lệnh? sử dụng lệnh Bash sau:

command "${my_array[@]/#/-}" "$1"

Tôi đang cố gắng để tìm ra những gì /#/-phần chính xác, chính xác. Thật không may, tôi không biết gọi nó là gì, vì vậy tôi gặp khó khăn khi tìm bất kỳ tài liệu nào. Tôi đã xem qua phần trang Bash của người đàn ông trên mảng và một vài trang web, nhưng không thể tìm thấy gì.

Câu trả lời:


24

Đây là một trường hợp thay thế mẫu trong mở rộng tham số shell : ${parameter/pattern/replacement}mở rộng ${parameter}, thay thế phiên bản đầu tiên của patternbằng replacement. Trong bối cảnh của một mẫu của loại này, #là đặc biệt: nó neo mẫu vào đầu tham số. Kết quả cuối cùng của tất cả điều này là mở rộng tất cả các giá trị trong my_arraymảng, chuẩn bị -cho từng cái (bằng cách thay thế mẫu trống ở đầu mỗi tham số).


2

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 //hoặc #hoặc %nó có ý nghĩa đặc biệt của all(lặp lại) startend.

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

Từ ngữ này hơi sai lệch 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ưng pattern=/x; echo "${var/$pattern}"không giống như echo "${var//x}". Lưu ý rằng #%có thể được kết hợp trong zsh, nhưng không phải bashcũng không ksh.
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.