2013-05-21 37 views
11

Tôi đang cố gắng tìm hiểu trường hợp khi tôi viết một kịch bản đầy đủ chức năng.Tuyên bố trường hợp Bash

tôi bắt đầu với bên dưới

#!/bin/sh 
case [email protected] in 

    -h|--help) 
      echo "You have selected Help" 
      ;; 
    -B|-b) 
      echo "You have selected B" 
      ;; 
    -C|-c) 
      echo "You have selected C" 
      ;; 
     *) 
      echo "Valid Choices are A,B,C" 
      exit 1 
      ;; 
esac 

Tôi muốn sử dụng hai trong số các tùy chọn này:

./getopts.sh -h -c 

Nhưng tôi nhận được kết quả này Lựa chọn hợp lệ là A, B, C

Vui lòng giúp bạn và cho tôi biết tôi đang làm gì sai?

Tôi muốn tạo tập lệnh sẽ thực hiện điều gì đó nếu bạn nhập một tùy chọn nhưng thực hiện nhiều việc nếu bạn nhập nhiều.

Ngoài ra làm thế nào tôi sẽ phân tích $ 1 cho tập lệnh này là surley mà bao giờ tùy chọn tôi nhập đầu tiên (-h) sẽ là $ 1 ??

Cảm ơn!

+0

Tại sao bạn không sử dụng 'getopts' thay vì' case'? – fedorqui

+0

Tôi đang mở cho bất kỳ ý tưởng như tôi đã không thực sự được sử dụng, hoặc. Tôi cần phải tìm hiểu điều này hơn là có 1000 lồng nhau nếu các câu lệnh – bsmoo

+0

@fedorqui Ngay cả với getopts, người ta vẫn cần một vòng lặp (thường là một vòng lặp while) và một số loại phân tích trường hợp, và 'case' là tốt hơn nhiều so với' if ... elif ... 'vì mục đích đó. – Uwe

Trả lời

11

Hãy thử điều này

#!/bin/sh 

usage() { 
    echo `basename $0`: ERROR: $* 1>&2 
    echo usage: `basename $0` '[-a] [-b] [-c] 
     [file ...]' 1>&2 
    exit 1 
} 


while : 
do 
    case "$1" in 
    -a|-A) echo you picked A;; 
    -b|-B) echo you picked B;; 
    -c|-C) echo you picked C;; 
    -*) usage "bad argument $1";; 
    *) break;; 
    esac 
    shift 
done 
+0

Được rồi, trông thật tuyệt. Một câu hỏi furhter nếu tôi muốn -a để làm 'whois $ 1' làm thế nào tôi sẽ làm cho công việc này tôi muốn việc sử dụng được một cái gì đó như' ./script.sh -a example.com' hoặc './script.sh -a - b example.com' bất kỳ ý tưởng về điều đó? – bsmoo

+0

Xem tùy chọn -o trong http://www.grymoire.com/Unix/Sh.html#uh-96 –

6

Sử dụng getopt hoặc getopts là giải pháp tốt hơn. Nhưng để trả lời câu hỏi trực tiếp của bạn, [email protected]tất cả đối số của bạn, vì vậy -h -c, không khớp với bất kỳ mẫu đối số đơn nào trong bản sao kê trường hợp của bạn. Bạn vẫn sẽ cần để lặp qua đối số của bạn như vậy

for arg in "[email protected]"; do 
    case $arg in 
     .... 
    esac 
done 
+3

FWIW: 'cho arg in" $ @ "; do ... 'tương đương với' cho arg; làm ... ' –

0

để phân tích các đối số vị trí như ... $ 1, chỉ cần sử dụng 1 $ trong trường hợp stmt và sau đó ở cuối ... sử dụng chuyển sang pust thứ 2 arg đến $ 1 và tương tự như vậy.

cũng tôi sẽ đưa stmt trường hợp trong một vòng lặp while hoặc tốt hơn một fxn để tôi có thể chạy nó hai lần cho hai lựa chọn hoặc số tùy chọn ..........

$ # sẽ cho bạn biết có bao nhiêu tùy chọn/đối số đã có.

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