2010-01-13 11 views
16

Tôi chỉ thấy một số mã trong bash mà tôi đã không hoàn toàn hiểu. Là người viết bash mới, tôi không chắc chuyện gì đang diễn ra.

echo ${0##/*} 
echo ${0} 

Tôi thực sự không thấy sự khác biệt về đầu ra trong hai lệnh này (in tên tập lệnh). Có phải đó là # chỉ là một bình luận? Và có gì với số /*. Nếu nó là một bình luận, làm thế nào nó không can thiệp với cú đúp đóng }?

Có ai có thể cho tôi một số thông tin chi tiết về cú pháp này không?

Trả lời

28

Xem phần Substring removal trong Advanced Bash-Scripting Guide:

${string##substring} 

Xóa trận đấu dài nhất của substring từ trước $ string.

* là ký tự đại diện, khớp với mọi thứ. Lệnh ${0##/*} in giá trị $0 trừ khi nó bắt đầu bằng dấu gạch chéo, trong trường hợp nó không in được gì.

+2

'$ {string ## substring}' xóa chuỗi con, chứ không phải chuỗi con $ –

0

Xem phần Parameter Expansion của trang bash(1) người đàn ông.

15

Linux tip: Bash parameters and parameter expansions

${PARAMETER##WORD} Results in removal of the longest matching pattern from the beginning rather than the shortest. 
for example 
[[email protected] ~]$ x="a1 b1 c2 d2" 
[[email protected] ~]$ echo ${x#*1} 
b1 c2 d2 
[[email protected] ~]$ echo ${x##*1} 
c2 d2 
[[email protected] ~]$ echo ${x%1*} 
a1 b 
[[email protected] ~]$ echo ${x%%1*} 
a 
[[email protected] ~]$ echo ${x/1/3} 
a3 b1 c2 d2 
[[email protected] ~]$ echo ${x//1/3} 
a3 b3 c2 d2 
[[email protected] ~]$ echo ${x//?1/z3} 
z3 z3 c2 d2