2015-03-06 18 views
5

Tôi gặp phải một số git commit để xóa một số lệnh readlinkdirname bằng phép thay thế ma thuật này cd ${0%/*}.

Bash diễn giải nó như thế nào?

+1

https://stackoverflow.com/questions/22401091/bash-variable-substitution-vs-dirname-and-basename –

+0

http://www.gnu.org/software/bash/manual/bashref.html#Shell -Thông số-Mở rộng –

+0

Tiếp diễn, http://stackoverflow.com/questions/4685615/search-engine-for-special-characters không hữu ích ở đây. Tôi chắc chắn có những bản sao trên StackOverflow nhưng tôi không thể tìm thấy chúng. – tripleee

Trả lời

7

% đây được gọi là toán tử khớp mẫu.

Một trích dẫn từ Học các Bash Shell cuốn sách:

Việc sử dụng cổ điển cho các nhà khai thác mô hình khớp là trong tước thành phần của tên đường dẫn, chẳng hạn như tiền tố và hậu tố thư mục tên tập tin. Với ý nghĩ đó, đây là một ví dụ cho thấy tất cả các toán tử hoạt động như thế nào. Giả sử rằng biến số path có giá trị /home/cam/book/long.file.name; sau đó:

Expression   Result 
${path##/*/}      long.file.name 
${path#/*/}    cam/book/long.file.name 
$path    /home/cam/book/long.file.name 
${path%.*}   /home/cam/book/long.file 
${path%%.*}  /home/cam/book/long 

Đây có thể là khó nhớ, vì vậy đây là một thiết bị ghi nhớ tiện dụng:

  • # phù hợp với trước vì số hiệu trước số;
  • % khớp với phần đuôi vì dấu phần trăm theo số.

Trong trường hợp cụ thể của bạn, 0 là đối tác của path trong ví dụ của tôi, vì vậy bạn nên biết điều đó.

Nếu $0/home/chj/myfile.txt, cd ${0%/*} sẽ mở rộng thành cd /home/chj, tức là tước phần "tệp".

Tôi hiểu sự thôi thúc của bạn khi đặt câu hỏi này, bởi vì quá khó để tìm kiếm câu trả lời mà không mất vài giờ để tìm kiếm một cuốn sách Bash.

1

Lệnh cd ${0%/*} thay đổi thư mục thành thư mục chứa tập lệnh, giả sử rằng $0 được đặt thành đường dẫn đầy đủ của tập lệnh.

Các vấn đề liên quan