ที่ทำงานฉันเขียนสคริปต์ทุบตีบ่อยๆ หัวหน้างานของฉันแนะนำว่าสคริปต์ทั้งหมดจะถูกแบ่งเป็นฟังก์ชั่นคล้ายกับตัวอย่างต่อไปนี้:
#!/bin/bash
# Configure variables
declare_variables() {
    noun=geese
    count=three
}
# Announce something
i_am_foo() {
    echo "I am foo"
    sleep 0.5
    echo "hear me roar!"
}
# Tell a joke
walk_into_bar() {
    echo "So these ${count} ${noun} walk into a bar..."
}
# Emulate a pendulum clock for a bit
do_baz() {
    for i in {1..6}; do
        expr $i % 2 >/dev/null && echo "tick" || echo "tock"
        sleep 1
    done
}
# Establish run order
main() {
    declare_variables
    i_am_foo
    walk_into_bar
    do_baz
}
main
มีเหตุผลใดที่จะทำสิ่งนี้นอกเหนือจาก "การอ่าน" ซึ่งฉันคิดว่าน่าจะเป็นที่ยอมรับได้ดีพอ ๆ กับความเห็นเพิ่มเติมและระยะห่างระหว่างบรรทัดบางส่วน?
มันทำให้สคริปต์ทำงานได้อย่างมีประสิทธิภาพมากขึ้น (จริง ๆ แล้วฉันคาดหวังสิ่งตรงกันข้ามถ้ามี) หรือทำให้การแก้ไขโค้ดง่ายกว่าความสามารถในการอ่านที่กล่าวมาข้างต้นหรือไม่? หรือมันเป็นเพียงแค่การตั้งค่าโวหาร?
โปรดทราบว่าแม้ว่าสคริปต์ที่ไม่ได้แสดงให้เห็นถึงมันได้ดี "สั่งรัน" ฟังก์ชั่นในสคริปต์ที่แท้จริงของเรามีแนวโน้มที่จะเป็นเชิงเส้นมาก - walk_into_barขึ้นอยู่กับสิ่งที่i_am_fooได้ทำและdo_bazทำหน้าที่ในสิ่งที่ตั้งขึ้นโดยwalk_into_bar- เพื่อให้เป็น ความสามารถในการสลับคำสั่งเรียกใช้งานโดยพลการไม่ใช่สิ่งที่เรามักจะทำ ตัวอย่างเช่นคุณจะไม่ก็ต้องการที่จะนำdeclare_variablesหลังจากwalk_into_barที่จะทำลายสิ่ง
ตัวอย่างของวิธีที่ฉันจะเขียนสคริปต์ข้างต้นจะเป็น:
#!/bin/bash
# Configure variables
noun=geese
count=three
# Announce something
echo "I am foo"
sleep 0.5
echo "hear me roar!"
# Tell a joke
echo "So these ${count} ${noun} walk into a bar..."
# Emulate a pendulum clock for a bit
for i in {1..6}; do
    expr $i % 2 >/dev/null && echo "tick" || echo "tock"
    sleep 1
done
          localให้ขอบเขตของตัวแปรที่มีความสำคัญอย่างมากในสคริปต์ที่ไม่สำคัญ
                
main()ที่ด้านบนและเพิ่มmain "$@"ที่ด้านล่างเพื่อเรียก นั่นช่วยให้คุณเห็นตรรกะของสคริปต์ระดับสูงสิ่งแรกเมื่อคุณเปิด