Làm thế nào để $ {0 ## * /} và $ {0% / *} hoạt động?


Câu trả lời:


38

Chúng không phải là biểu thức chính quy, chúng là ví dụ về mở rộng tham số của Bash: thay thế một biến hoặc một tham số đặc biệt bằng giá trị của nó. Wiki Wooledge có một lời giải thích tốt .

Về cơ bản, trong ví dụ bạn có, ${0##*/}dịch là:

đối với biến $ 0 và mẫu '/', hai giá trị băm có nghĩa là từ đầu tham số, xóa kết quả dài nhất (hoặc tham lam) khớp với tối đa và bao gồm cả mẫu.

Vì vậy, $0tên của một tệp ở đâu, ví dụ $HOME/documents/doc.txt,, sau đó, tham số sẽ được mở rộng thành:doc.txt

Tương tự, đối với ${0%/*}, mẫu /được khớp với cuối tham số (the %), với kết quả khớp ngắn nhất hoặc không tham lam đã bị xóa - mà trong ví dụ trên sẽ cung cấp cho bạn $HOME/documents.

Xem thêm bài viết trên Wiki của Bash Hacker .


2
Vậy ... họ không muốn sử dụng basenamedirname? : D
Aaron D. Marasco

8
Một lợi thế là tham số susbstlation không sinh ra một quy trình con ...
jasonwryan

@ jasonwryan, bạn có thể xây dựng chức năng của * trong hai ví dụ trên không? Hoặc tại sao chúng ta phải đặt * ở đó. Cụ thể, trong ví dụ đầu tiên, * được đặt trước //; trong khi trong ví dụ thứ hai, * được đặt sau /. Sự khác biệt cơ bản là gì? Cảm ơn.
dùng785099

3
Toàn cầu ( *) chỉ ra rằng mọi thứ lên đến và bao gồm cả mẫu sẽ bị xóa. Do đó, đối với phần đầu của tham số, #nó nằm ở bên trái và phần cuối %, hoạt động theo cách khác từ bên phải.
jasonwryan

5
Nó không đặc trưng cho bash, được chỉ định bởi POSIX sh.
nyuszika7h
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.