2015-04-14 14 views
13

Tôi đang tạo một hàm (bên dưới) mà bạn có thể cung cấp đối số, thư mục. Tôi thử nghiệm nếu là một thư mục có tùy chọn -d, nhưng điều đó dường như không hoạt động, nó luôn trả về true ngay cả khi không có đối số nào được cung cấp. Tôi cũng đã thử test -n $argv -a -d $argv để kiểm tra là là trống sting, nhưng điều đó trả về lỗi test: Missing argument at index 1. Làm thế nào tôi nên kiểm tra nếu bất kỳ đối số được cung cấp với chức năng hay không? Tại sao test -d $argv không hoạt động, từ sự hiểu biết của tôi nó sẽ là sai khi không có đối số được cung cấp, bởi vì chuỗi rỗng không phải là một thư mục.Vỏ cá: Kiểm tra xem đối số có được cung cấp cho hàm

function fcd 
    if test -d $argv 
     open $argv 
    else 
     open $PWD 
    end 
end 

Cảm ơn sự trợ giúp.

Trả lời

23

count là đúng cách để làm điều này. Đối với trường hợp chung của kiểm tra xem có bất kỳ đối số, bạn có thể sử dụng trạng thái thoát của nó:

function fcd 
    if count $argv > /dev/null 
     open $argv 
    else 
     open $PWD 
    end 
end 

Để trả lời câu hỏi thứ hai của bạn, test -d $argv trả về true nếu là trống rỗng, vì POSIX đòi hỏi rằng khi test được truyền một đối số , nó phải "Thoát đúng (0) nếu $ 1 không phải là null; nếu không, thoát sai". Vì vậy, khi $ argv trống, test -d $argv có nghĩa là test -d phải thoát khỏi true vì -d không trống! Argh!

chỉnh sửa Thêm một thiếu end, nhờ Ismail cho nhận thấy

+1

Mã trên thiếu một 'kết thúc', tôi không thể chỉnh sửa vì nó nhỏ hơn 6 ký tự tối thiểu - Vui lòng cập nhật câu trả lời ở trên ... –

+0

Tôi đã nhầm lẫn với'>/dev/null' để tôi tìm thấy thay thế là tiết hơn, nhưng dễ đọc hơn với tôi: 'nếu kiểm tra (đếm $ a) -gt 0; ...; kết thúc' – FMCorz

4

là danh sách , vì vậy bạn muốn xem xét các yếu tố đầu tiên, nếu có những yếu tố trong danh sách đó:

if begin; test (count $argv) -gt 0; and test -d $argv[1]; end 
    open $argv[1] 
else 
    open $PWD 
end 
11

Trong cá 2.1 + ít nhất, bạn có thể đặt tên cho lập luận của bạn, sau đó cho phép mã cho là ngữ nghĩa hơn:

function fcd --argument-names 'filename' 
    if test -n "$filename" 
     open $filename 
    else 
     open $PWD 
    end 
end 
3

Có lẽ là không liên quan, nhưng tôi muốn thêm một quan điểm cho câu hỏi.

Tôi muốn mở rộng thông tin chi tiết về phạm vi rộng hơn phạm vi kiểm tra mã trình bao với các thư viện được phát triển trong nhóm ngư dân.

Với mock bạn có thể kiểm tra xem lệnh mở được gọi là an toàn không có tác dụng phụ.

Ví dụ .:

function fcd 
    if count $argv > /dev/null 
     open $argv 
    else 
     open $PWD 
    end 
end 
mock open 0 "echo \$args" 
fcd "cool" # echoes cool 
mock open 0 "echo \$args" 
fcd # echoes $PWD 

Là một thư viện gần đây, nhưng nó có thể giúp để thử nghiệm những điều mà có thể là nguy hiểm, ví dụ như rm

mock rm 0 "echo nothing would happen on \$args" 
rm "some file" # simply echoes the message with a list of the files that would been affected 

Tôi hy vọng rằng nó mang lại một hiểu thêm của quan điểm của hộp

PS: Xin lỗi vì sự công khai trắng trợn, nhưng tôi nghĩ đó là một ý tưởng hay khi được sử dụng bởi trình bao kịch bản, để kiểm tra và thêm tính bền vững vào vỏ kịch bản là các loại hạt. : P

EDIT: gần đây tôi đã nhận thấy lỗi về mẫu tôi đã đăng.Vui lòng không sử dụng rm *, vì dấu hoa thị không được coi là thông số, thay vì trình bao mở rộng dấu hoa thị vào danh sách các tệp được tìm thấy và lệnh chỉ chế nhạo cuộc gọi đầu tiên, điều này có nghĩa là tệp đầu tiên sẽ bị bỏ qua bởi mô hình, nhưng tất cả các tệp tiếp theo sẽ bị xóa bị xóa vì vậy hãy cẩn thận nếu thử mẫu và sử dụng một tệp duy nhất cho ví dụ không phải là ký tự đại diện.

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