2010-06-25 4 views
6

Tôi có một kịch bản lệnh vỏ cá có hành vi mặc định là gửi email khi hoàn tất. Tôi muốn sửa đổi nó để đáp ứng một đối số nomail từ dòng lệnh. Vì vậy, ví dụ, chạy kịch bản thông thường sẽ tạo ra một email:Viết kịch bản vỏ cá bằng một đối số tùy chọn

michaelmichael: ~/bin/myscript

Nhưng nếu chạy với nomail chuyển đổi, nó sẽ không gửi email xác nhận:

michaelmichael: ~/bin/myscript nomail

Nếu Tôi chạy kịch bản với đối số nomail, nó chạy tốt. Nếu không có nomail, không xác định và sẽ phát ra lỗi. Tôi đã lùng sục tài liệu về vỏ cá, nhưng dường như không tìm được thứ gì có hiệu quả. Dưới đây là những gì tôi có cho đến nay

switch $argv 
    case nomail 
    ## Perform normal script functions 
    case ??? 
    ## Perform normal script functions 
    mailx -s "Script Done!" 
end 

Chạy này ném các lỗi sau:

switch: Expected exactly one argument, got 0

Rõ ràng nó hy vọng một cuộc tranh cãi, tôi chỉ không biết cú pháp cho nói cho nó để chấp nhận không có đối số , hoặc một nếu nó tồn tại.

Tôi đoán điều này là khá cơ bản, nhưng tôi không hiểu shell scripting rất tốt.

+0

Đó là hữu ích hơn nếu bạn gửi các thông báo lỗi cụ thể. Đã thêm –

+0

. xin lỗi vì điều đó. – michaelmichael

Trả lời

7

Quấn tuyên bố switch của bạn như thế này:

if set -q argv 
    ... 
end 

Ngoài ra, tôi nghĩ rằng trường hợp mặc định của bạn nên được case '*'.

+0

Đã hoạt động (mặc dù 'nomail' phải là trường hợp mặc định chứ không phải '*'). Đây là những gì tôi đã thay đổi nó thành: 'if set -q argv; chuyển $ argv; trường hợp nomail; echo Không gửi thư .; case '*'; echo Công tắc không xác định .; kết thúc; khác; echo gửi thư .; end' – michaelmichael

+0

@michaelmichael: Theo mặc định, tôi có nghĩa là mặc định của câu lệnh 'switch' được thực thi nếu không có trường hợp nào được chỉ định khớp. Chính xác cách bạn có mã trong nhận xét của mình. Xin lỗi, tôi đã đọc sai mã gốc của bạn và nhầm lẫn "???" như thể nó được dự định là 'switch' mặc định. –

5

Nếu bạn thích sử dụng câu lệnh switch nó cũng có thể:

switch (echo $argv) 
    case nomail 
    ## Perform normal script functions 
    case '*' 
    ## Perform normal script functions 
    mailx -s "Script Done!" 
end