ไปข้างหน้าการประกาศฟังก์ชันใน Bash หรือเชลล์สคริปต์?


97

มีสิ่งนั้นในbashหรืออย่างน้อยก็มีบางอย่างที่คล้ายกัน (วิธีแก้ปัญหา) เช่นการประกาศล่วงหน้าที่รู้จักกันดีใน C / C ++ หรือไม่?

หรือมีสิ่งนั้นเพราะตัวอย่างเช่นมันถูกดำเนินการในครั้งเดียวเสมอ (บรรทัดหลังบรรทัด)?

หากไม่มีการประกาศล่วงหน้าฉันควรทำอย่างไรเพื่อให้สคริปต์อ่านง่ายขึ้น ค่อนข้างยาวและคำจำกัดความของฟังก์ชันเหล่านี้ในตอนต้นผสมกับตัวแปรส่วนกลางทำให้สคริปต์ของฉันดูน่าเกลียดและอ่าน / เข้าใจยาก)? ฉันขอให้เรียนรู้แนวทางปฏิบัติที่เป็นที่รู้จัก / ดีที่สุดสำหรับกรณีดังกล่าว


ตัวอย่างเช่น:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}

คำตอบ:


191

คำถามที่ดี ฉันใช้รูปแบบเช่นนี้กับสคริปต์ส่วนใหญ่ของฉัน:

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"

คุณสามารถอ่านโค้ดจากบนลงล่างได้ แต่จะไม่เริ่มดำเนินการจนถึงบรรทัดสุดท้าย โดยการส่งผ่าน"$@"ไปยังหน้าหลัก () คุณสามารถเข้าถึงการขัดแย้งบรรทัดคำสั่ง$1, $2, et al เพียงแค่คุณได้ตามปกติ


3
สวัสดีคุณจัดโครงสร้างข้อมูลที่ต้องใช้ร่วมกันระหว่าง foo / bar / baz ในตัวอย่างของคุณอย่างไร โดยปกติฉันจะวางไว้ที่ด้านบนสุดของสคริปต์ ยังคงเป็นเช่นนี้เมื่อใช้ฟังก์ชันหรือไม่? หรือจะดีกว่าถ้าใส่ข้อมูลส่วนกลางเป็นหลักแล้วส่งต่อให้ foo / bar / baz เป็นอาร์กิวเมนต์? แนวทางปฏิบัติที่ดีที่สุดคืออะไร?
bodacydo

4
ฉันชอบการโต้แย้งมากกว่า ยกเว้นสิ่งนั้นฉันจะตั้งค่าตัวแปรส่วนกลางในmainหรือในฟังก์ชันทันทีmain(เช่นsetupหรือparseArguments) ฉันหลีกเลี่ยงตัวแปรทั่วโลกกำหนดข้างต้นmain- mainรหัสไม่ควรไปนอก
John Kugelman

สิ่งนี้ดูเหมือนจะค่อนข้างคล้ายคลึงกับสิ่งที่if _ _ name _ _ == "_ _ main _ _": main()ทำใน python
Sergiy Kolodyazhnyy

สิ่งนี้ยอดเยี่ยมเช่นกันเมื่อใช้เครื่องมือเช่นBatsเพื่อทดสอบสคริปต์ของคุณการแบ่งทุกอย่างออกเป็นฟังก์ชันทำให้การทดสอบส่วนประกอบแต่ละส่วนง่ายขึ้นมาก ดูบล็อกโพสต์ด้วย
dragon788

31

เมื่อสคริปต์ทุบตีของฉันเติบโตมากเกินไปฉันใช้กลไกการรวม:

ไฟล์allMyFunctions:

foo() {
}

bar() {
}

baz() {
}

ไฟล์main:

#!/bin/bash

. allMyfunctions

foo
bar
baz

28
โดยส่วนตัวแล้วเมื่อเชลล์สคริปต์เริ่มเติบโตผ่านไฟล์เดียวฉันมักจะเปลี่ยนไปใช้ภาษาอื่น ;-)
Joachim Sauer

ใช้จะไม่ดีกว่าsource allMyfunctionsเหรอ
pydoge

4
@pydoge: sourceไม่สอดคล้องกับ POSIX bashกำหนดsourceเป็นนามแฝงว่า.: เทียบเท่ากับฟังก์ชัน
mouviciel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.