Bash veya Shell betiğindeki işlev bildirimlerini iletin


97

bashÖrneğin, C / C ++ 'da iyi bilinen ileriye dönük bildirimler gibi bir şey veya en azından buna benzer (geçici çözüm) bir şey var mı ?

Ya da böyle bir şey var çünkü örneğin her zaman bir geçişte (satır satır) yürütülüyor mu?

İleriye dönük beyan yoksa, betiğimin okunmasını kolaylaştırmak için ne yapmalıyım? Oldukça uzun ve başlangıçtaki bu fonksiyon tanımları, global değişkenlerle karıştırılmış, betiğimi çirkin ve okunması / anlaşılması zor gösteriyor)? Bu tür durumlar için bazı iyi bilinen / en iyi uygulamaları öğrenmek istiyorum.


Örneğin:

# something like forward declaration
function func

# execution of the function
func

# definition of func
function func
{
    echo 123
}

Yanıtlar:


191

Harika soru. Komut dosyalarımın çoğu için buna benzer bir kalıp kullanıyorum:

#!/bin/bash

main() {
    foo
    bar
    baz
}

foo() {
}

bar() {
}

baz() {
}

main "$@"

Kodu yukarıdan aşağıya okuyabilirsiniz, ancak aslında son satıra kadar çalışmaya başlamaz. "$@"Main () 'e geçerek , normalde yaptığınız gibi komut satırı argümanlarına $1, $2vb. Erişebilirsiniz.


3
Merhaba, örneğinizde foo / bar / baz arasında paylaşılması gereken verileri nasıl yapılandırıyorsunuz? Genellikle onu senaryonun en üstüne koyarım. Fonksiyonları kullanırken durum hala böyle mi? Yoksa global veriyi esas alıp foo / bar / baz'a argüman olarak iletmek daha mı iyi? En iyi uygulama nedir?
bodacydo

4
Tartışmayı tercih ederim. Bunun dışında, global değişkenleri mainbir fonksiyonun hemen arkasına main(örneğin, setupveya parseArguments) koyacağım . Yukarıda küresel değişkenlerin ayarlanmasından kaçınıyorum main- kodun dışına çıkmamalı main.
John Kugelman

Bu if _ _ name _ _ == "_ _ main _ _": main(),
python'da yapılana

Bats gibi araçları kullanarak komut dosyalarınızı test ederken bu harika bir özelliktir , her şeyi işlevlere ayırmak, tek tek bileşenleri test etmeyi çok daha kolay hale getirir. Ayrıca blog gönderisine
dragon788

31

Bash komut dosyalarım çok fazla büyüdüğünde, bir içerme mekanizması kullanıyorum:

Dosya allMyFunctions:

foo() {
}

bar() {
}

baz() {
}

Dosya main:

#!/bin/bash

. allMyfunctions

foo
bar
baz

28
Şahsen, bir kabuk betiği bir dosyada büyümeye başladığında, farklı bir dile geçme eğilimindeyim ;-)
Joachim Sauer

Kullanması daha iyi olmaz source allMyfunctionsmı?
pydoge

4
@pydoge: sourcePOSIX uyumlu değil. bir takma ad olarak bashtanımlar : işlevsel olarak eşdeğerdirler. source.
mouviciel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.