2012-03-04 2 views
12

Tôi đã xem xét một số mã cũ của tôi và đã xem qua cú pháp này, nhưng tôi quên chính xác những gì nó có nghĩa :-)

extractDir="${downloadFileName%.*}-tmp" 

Thông tin duy nhất tôi thấy việc tìm kiếm đề cập đến một danh sách các lệnh, nhưng điều này chỉ là một biến. Cú pháp ngoặc nhọn này có nghĩa gì trong bash?

+3

Bắt đầu với * toàn diện * [Hướng dẫn tham khảo BASH] (http://www.gnu.org/software/bash/manual/bashref.html) ... Nó được đề cập trong [Mở rộng tham số] (http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion). (Dấu ngoặc nhọn có nghĩa là một cái gì đó khác khi * không * đứng trước ký hiệu '$'.) –

Trả lời

20

Trong ngữ cảnh này, nó là parameter substitution.

Các ${variable%.*} nghĩa mất giá trị của $variable, lột mô hình .* từ đuôi của giá trị (ghi nhớ: phần trăm có một 't' ở Tail), và đưa ra kết quả. (Ngược lại, ${variable#xyz} nghĩa loại bỏ xyz từ người đứng đầu giá trị của biến, bởi vì (ghi nhớ) một Hash có một 'h' tại Trụ.)

Given:

downloadFileName=abc.tar.gz 
extractDir=abc.tar-tmp 

Các ký hiệu thay thế:

extractDir=${downloadFileName%%.*} 

mang

abc-tmp 

Các %% có nghĩa là loại bỏ đuôi dài nhất có thể; tương ứng, ## có nghĩa là xóa đầu kết hợp dài nhất.

+0

Cảm ơn bạn đã trả lời kỹ lưỡng! –

+0

@Shane: Bạn có chắc chắn không? Trong Bash? Bash gần như được vá đầy đủ của tôi (4.3.27 (2)) trên Mac OS X 10.10 không thích nó: 'downloadFileName = abc.tar.gz; echo $ {$ {downloadFileName # abc.}%. gz} 'generate:' bash-4.3: $ {$ {downloadFileName # abc.}%. gz}: thay thế xấu'. Bạn có thể chỉ định nền tảng nào và phiên bản Bash nào không? –

+0

Trong Zsh (** không Bash **), chúng cũng có thể được lồng nhau (ví dụ: $ {$ {downloadFilename # abc.}%. Gz} mang lại "tar"). Cảm ơn @JonathanLeffler vì đã bắt được. – Shane

0

Nó được sử dụng khi mở rộng biến môi trường liền kề với một số văn bản không phải là biến, do đó, trình bao không bao gồm tất cả nó trong tên biến.