2012-11-27 5 views
64

bash에 그런 것이 있습니까? 예를 들어, C/C++에서 잘 알려진 forward 선언문과 비슷한 (work-around) 것이 있습니까?Bash 또는 쉘 스크립트에서 전달 함수 선언?

예를 들어 항상 한 줄 (줄 이후의 줄)에서 실행되기 때문에 그런 것이 있습니까?

전달 선언이 없으면 스크립트를 읽기 쉽게하려면 어떻게해야합니까? 오히려 길며, 전역 변수와 혼합 된 처음에이 함수 정의는 내 스크립트가보기 흉하고보기 어렵게 보입니다)? 나는 그런 경우에 대해 잘 알려진/모범 사례를 배워야합니다. 예를 들어


:

# something like forward declaration 
function func 

# execution of the function 
func 

# definition of func 
function func 
{ 
    echo 123 
} 

답변

135

위대한 질문입니다.

#!/bin/bash 

main() { 
    foo 
    bar 
    baz 
} 

foo() { 
} 

bar() { 
} 

baz() { 
} 

main "[email protected]" 

당신은 위에서 아래로 코드를 읽을 수 있지만 실제로 마지막 줄까지 실행을 시작하지 않습니다 : 내 스크립트의 대부분이 같은 패턴을 사용합니다. "[email protected]"을 main()에 전달하면 평상시대로 명령 줄 인수 $1, $2 등을 액세스 할 수 있습니다.

파일 allMyFunctions :

foo() { 
} 

bar() { 
} 

baz() { 
} 

파일 main :

#!/bin/bash 

. allMyfunctions 

foo 
bar 
baz 
+3

안녕하세요, 당신은 어떻게이 데이터를 구조화 할 – bodacydo

+4

나는 논쟁을 선호합니다. 그것을 제외하고, 전역 변수를'main' 또는'main' 바로 뒤에있는 함수 (예 :'setup' 또는'parseArguments')에 설정할 것입니다. 나는 전역 변수를'main'보다 높게 설정하는 것을 피합니다. 코드는'main'의 바깥으로 나가서는 안됩니다. –

+0

이것은 파이썬에서'if _ _ name _ _ == "_ _ main _ _"과 유사합니다. –

26

내 bash는 스크립트가 너무 많이 성장

는, 나는 메커니즘 등 사용 귀하의 예에서 foo/bar/baz간에 공유 되나요? 보통 나는 스크립트의 맨 위에 놓았습니다. 함수를 사용할 때도 마찬가지입니까? 또는 메인에 전역 데이터를 넣은 다음 인수로 foo/bar/baz에 전달하는 것이 더 좋습니까? 가장 좋은 방법은 무엇입니까?
+16

개인적으로 쉘 스크립트가 하나의 파일을 따라 자라기 시작하면 필자는 다른 언어 ;-) –

+0

플러스 1 | [POSIX] (https://en.wikipedia.org/wiki/POSIX) - 준수. – Vlastimil

관련 문제