2009-07-14 4 views
5

Tôi không quen thuộc với ngữ nghĩa của "- @" trong đoạn mã bash bên dưới, là từ /etc/bash_completion.d/subversion. Tôi đang cố gắng để hiểu tại sao báo cáo bash "lỗi cú pháp gần dấu hiệu bất ngờ '(' trên dòng này, tôi có hai câu hỏi:Cú pháp trường hợp Bash - ý nghĩa của "- @"

  1. là gì? '- @()' dự kiến ​​sẽ làm ở đây
  2. Tại sao có thể bash được hài lòng với tuyên bố này?

    case $prev in 
           # other cases omitted 
        [email protected](F|-file|-targets)) 
         _filedir 
         return 0; 
         ;; 
           # other cases omitted 
         esac 
    

Trả lời

4

các '@ (...)' đây là một phần của cú pháp pattern matching bash. đây là một "hay", nó chỉ đơn giản phù hợp với một trong những mẫu được liệt kê , được phân tách bằng các ký tự ống.

Dấu gạch ngang ban đầu chỉ đơn giản là yếu tố ngoài biểu thức; "- @ (a | b | c)" giống với "@ (- a | -b | -c)", nhưng ngắn hơn.

Như được chỉ ra bởi người nhận xét (cảm ơn!) Điều này yêu cầu bật chức năng extglob của Bash để hoạt động. Này được thực hiện như sau:

shopt -s extglob 

Bạn có thể kiểm tra xem bạn đã có nó được kích hoạt như thế này:

shopt extglob 
+1

Tôi đoán "- @ (F | -file | -targets)" tương đương với "-F | --file | --targets" (trong đó '|' có nghĩa là "hoặc"), nhưng tôi là thiên đường ' t có thể xác nhận từ tài liệu. –

+0

http://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching Xem phần dưới cùng của phần nơi 'extglob' được đề cập. – ephemient

0

Các "@" là một mô hình có nghĩa là "phù hợp với một và chỉ một". Và bạn dường như có một dấu ngoặc đóng thêm trong ví dụ mã của bạn, đó là lỗi đánh máy hoặc lỗi cú pháp của bạn.

+1

Không phải là phần đóng ngoặc của trường hợp cú pháp? Xem ở đây, ví dụ: . – unwind

0

này là hoàn toàn đoán, như tôi không quen thuộc với tất cả các cú pháp bash, nhưng tôi nghĩ rằng nó nên được nhiều hơn như:

@(-F|-file|-targets)) 

... có ý nghĩa cho các câu trả lời khác ở đây - @() khớp với một trong các đối số lệnh và thêm ) là một phần của cấu trúc trường hợp. Tôi chỉ nghĩ rằng dấu gạch ngang ở sai chỗ.

+0

Xem nhận xét của Lance Richardson về câu trả lời của bạn. –

1

Tôi đã tìm thấy câu trả lời cho phần thứ hai của câu hỏi của mình, đó là để bật "@ (...)", tùy chọn trình bao "extglob" cần phải được bật. Thực hiện:

shopt -s extglob 

trước khi thực hiện kịch bản loại bỏ lỗi.