2012-03-02 39 views
12
foo="/sdf/here/jfds" 
bar="${foo##*/}" 

Canyone giải thích như thế nào "${foo##*/}" biểu hiện làm việc vì tôi hiểu nó sẽ trả về chuỗi sau dấu gạch chéo cuối cùng (tức là jfds) nhưng tôi không có ý tưởng như thế nào nó có phải nó (hoặc loại biểu thức này được gọi là gì)?bash - biểu hiện sau khi nhân vật cụ thể cuối cùng

+1

Nó được gọi là [mở rộng tham số] (http://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion). Liên kết cũng giải thích "cách hoạt động", tức là mô tả những gì nó hoạt động. Hay bạn có câu hỏi cụ thể hơn về nó? –

Trả lời

22

Đây là một trong nhiều tính năng vỏ, được gọi chung là mở rộng vỏ . Việc mở rộng cụ thể này được gọi là thông số mở rộng *.

Bạn có thể nghĩ biểu mẫu mở rộng vỏ cụ thể này là hàm bên trái cắt ngắn. Bạn phải sử dụng dấu ngoặc nhọn như hình (mà không phải là không bắt buộc) ..

Khi bạn chỉ sử dụng một #, nó có nghĩa là trái truncate chỉ sự xuất hiện đầu tiên của mô hình mà sau (lên đến đóng }. khi bạn sử dụng hai ##, nó có nghĩa là trái cắt ngắn tất cả liên tiếp mẫu-trận đấu. kết quả của var="a/b/c"; echo ${var#*/}b/c ... echo ${var##*/} lợi nhuận c.

có một bổ sung phải cắt ngắn. nó sử dụng % thay o f # ... (Tôi "nhớ" là vì # giống như nhận xét bash; luôn ở bên trái).

* được coi là mở rộng ký tự đại diện bash.

Dưới đây là danh sách tất cả các mở rộng vỏ, được trình bày theo thứ tự ưu tiên.

Trình tự mở rộng là:

1. brace expansion ... prefix{-,\,}postfix    # prefix-postfix prefix,postfix 
        .. {oct,hex,dec,bin}    # oct hex dec bin 
        . {a..b}{1..2}     # a1 a2 b1 b2 
        . {1..04}       # 01 02 03 04 
        . {01..4}       # 01 02 03 04 
        . {1..9..2}      # 1 3 5 7 9 
        . \$\'\\x{0..7}{{0..9},{A..F}}\' # $'\x00' .. $'\x7F'  

2. tilde expansion .... ~   # $HOME 
        ... ~axiom  # $(dirname "$HOME")/axiom 
        ... ~fred  # $(dirname "$HOME")/fred 
        .. ~+   # $PWD  (current working directory) 
        .. ~-   # $OLDPWD (previous working directory. If OLDPWD is unset, 
                 ~- is not expanded. ie. It stays as-is, 
                  regardless of the state of nullglob.) 
            # Expansion for Directories in Stack. ie. 
            # The list printed by 'dirs' when invoked without options 
         . ~+N   # Nth directory in 'dirs' list (from LHS) 
         . ~-N   # Nth directory in 'dirs' list (from RHS) 

3. parameter expansion .... ${VAR/b/-dd-} 
         ... ${TEST_MODE:-0} 
         .. ${str: -3:2} # note space after : 
          . ${#string} 

4. (processed left-to-right) 
    variable expansion 
    arithmetic expansion 
    command substitution 

▶5. word splitting   # based on $IFS (Internal Field Seperator) 

▷6. pathname expansion 
     according to options such as: 
     nullglob, GLOBIGNORE, ...and more 

# Note: =============== 
▶ 5. word splitting  ↰ 
▷ 6. pathname expansion ↰ 
# ===================== ↳ are not performed on words between [[ and ]] 
Các vấn đề liên quan