2010-12-29 29 views
43

Trang man cho biết rằng các câu lệnh case sử dụng "kết hợp mẫu mở rộng tên tệp".
Tôi thường muốn có những cái tên viết tắt của một số thông số, vì vậy tôi đi:Cách sử dụng các mẫu trong câu lệnh case trong bash scripting?

case $1 in 
    req|reqs|requirements) TASK="Functional Requirements";; 
    met|meet|meetings) TASK="Meetings with the client";; 
esac 

logTimeSpentIn "$TASK" 

tôi đã cố gắng mẫu như req* hoặc me{e,}t mà tôi hiểu sẽ mở rộng một cách chính xác để phù hợp với những giá trị trong bối cảnh mở rộng tên tập tin, nhưng nó không hoạt động.

Trả lời

24

Tôi không nghĩ bạn có thể sử dụng niềng răng.

Theo hướng dẫn sử dụng Bash về trường hợp trong Conditional Constructs.

Mỗi mẫu phải trải qua dấu ngã mở rộng, mở rộng tham số, lệnh thay thế, và số học mở rộng.

Không có gì đáng tiếc về số Brace Expansion.

Vì vậy, bạn sẽ phải làm một cái gì đó như thế này:

case $1 in 
    req*) 
     ... 
     ;; 
    met*|meet*) 
     ... 
     ;; 
    *) 
     # You should have a default one too. 
esac 
+3

+1 cho ví dụ 'met * | meet *'. – JohnJ

92

mở rộng Brace không làm việc, nhưng *, ?[] làm. Nếu bạn đặt shopt -s extglob sau đó bạn cũng có thể sử dụng extended pattern matching:

  • ?() - zero hoặc một lần xuất hiện của mẫu
  • *() - zero hoặc nhiều lần xuất hiện của mẫu
  • +() - một hoặc nhiều lần xuất hiện của mẫu
  • @() - một lần xuất hiện của mẫu
  • !() - bất cứ điều gì ngoại trừ mẫu

Dưới đây là một ví dụ:

case $1 in 
    a*   ) foo;; # matches anything starting with "a" 
    b?   ) bar;; # matches any two-character string starting with "b" 
    c[de]   ) baz;; # matches "cd" or "ce" 
    me?(e)t  ) qux;; # matches "met" or "meet" 
    @(a|e|i|o|u) ) fuzz;; # matches one vowel 
    m+(iss)?(ippi)) fizz;; # matches "miss" or "mississippi" or others 
esac 
+0

Liên kết tới tài liệu về các tài liệu này: https://www.gnu.org/software/bash/manual/html_node/Pattern-Matching.html#Pattern-Matching – phyatt

+0

@phyatt: Cảm ơn. Tôi đã thêm liên kết vào câu trả lời của tôi. –

0

ifgrep -E nhiều giải pháp di động

Đối với tính di động, tôi khuyên bạn chỉ cần sử dụng if báo cáo và grep -E mà hỗ trợ extended regular expressions, ví dụ:

arg='abc' 
if echo "$arg" | grep -Eq 'a.c|d.*'; then 
    echo 'first' 
elif echo "$arg" | grep -Eq 'a{2,3}'; then 
    echo 'second' 
fi 

POSIX 7

Bash dường như theo POSIX theo mặc định mà không shopt như đã đề cập bởi https://stackoverflow.com/a/4555979/895245

Dưới đây là đoạn trích: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 phần "Trường hợp Construct có điều kiện":

Trường hợp xây dựng có điều kiện sẽ thực hiện danh sách hợp chất tương ứng với danh sách đầu tiên một trong nhiều mẫu (xem Ký hiệu khớp mẫu) [...] Nhiều mẫu có cùng một danh sách hợp chất sẽ được giới hạn bởi '|' ký hiệu. [...]

Định dạng đối với trường hợp xây dựng như sau:

case word in 
    [(] pattern1) compound-list ;; 
    [[(] pattern[ | pattern] ...) compound-list ;;] ... 
    [[(] pattern[ | pattern] ...) compound-list] 
    esac 

và sau đó http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 phần chỉ đề cập đến ?, *[] "2.13 Pattern Matching Notation.".

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