2012-11-27 29 views
64

Có một điều như vậy trong bash hoặc ít nhất một cái gì đó tương tự (làm việc-xung quanh) như tờ khai về phía trước, nổi tiếng trong C/C++, ví dụ?Tuyên bố hàm chuyển tiếp trong tập lệnh Bash hoặc Shell?

Hoặc có quá nhiều thứ như vậy vì ví dụ nó luôn được thực hiện trong một lần (dòng sau dòng)?

Nếu không có khai báo chuyển tiếp, tôi nên làm gì để làm cho tập lệnh của tôi dễ đọc hơn. Đó là khá dài và các định nghĩa chức năng lúc đầu, trộn lẫn với các biến toàn cầu, làm cho kịch bản của tôi trông xấu xí và khó đọc/hiểu)? Tôi yêu cầu tìm hiểu một số thực tiễn tốt nhất/nổi tiếng cho các trường hợp như vậy.


Ví dụ:

# something like forward declaration 
function func 

# execution of the function 
func 

# definition of func 
function func 
{ 
    echo 123 
} 

Trả lời

135

Great câu hỏi. Tôi sử dụng một mô hình như thế này đối với hầu hết các kịch bản của tôi:

#!/bin/bash 

main() { 
    foo 
    bar 
    baz 
} 

foo() { 
} 

bar() { 
} 

baz() { 
} 

main "[email protected]" 

Bạn có thể đọc mã từ trên xuống dưới, nhưng nó không thực sự bắt đầu thực hiện cho đến dòng cuối cùng. Bằng cách vượt qua "[email protected]" đến chính(), bạn có thể truy cập các đối số dòng lệnh $1, $2, et al giống như bình thường.

+3

Hi, làm thế nào để bạn cấu trúc dữ liệu mà có được chia sẻ giữa foo/bar/baz trong ví dụ của bạn? Thông thường tôi chỉ đặt nó ở trên cùng của kịch bản. Đây có phải là trường hợp khi sử dụng các chức năng không? Hoặc là tốt hơn để đặt dữ liệu toàn cầu trong chính, và sau đó vượt qua nó để foo/bar/baz là đối số? Thực hành tốt nhất là gì? – bodacydo

+4

Tôi thích các đối số. Chặn điều đó, tôi sẽ đặt các biến toàn cục trong 'main' hoặc trong một hàm ngay sau' main' (ví dụ: 'setup' hoặc' parseArguments'). Tôi tránh các biến toàn cầu được đặt ở trên 'main' - mã không được nằm ngoài' main'. –

+0

Điều này có vẻ hơi giống với cái 'nếu _ _ tên _ _ ==" _ _ chính _ _ ": chính()' làm trong python –

26

Khi kịch bản bash của tôi phát triển quá nhiều, tôi sử dụng một bao gồm cơ chế:

file allMyFunctions:

foo() { 
} 

bar() { 
} 

baz() { 
} 

file main:

#!/bin/bash 

. allMyfunctions 

foo 
bar 
baz 
+16

Cá nhân, khi một tập lệnh shell bắt đầu phát triển qua một tệp, tôi có xu hướng chuyển sang ngôn ngữ khác ;-) –

+0

Plus 1 | Đối với sự tuân thủ [POSIX] (https://en.wikipedia.org/wiki/POSIX). – Vlastimil

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