Bash 또는 Shell 스크립트에서 함수 선언을 전달 하시겠습니까?


96

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, 등 당신이 평소처럼.


3
안녕하세요, 귀하의 예제에서 foo / bar / baz간에 공유해야하는 데이터를 어떻게 구성합니까? 보통 나는 그것을 스크립트의 맨 위에 놓았습니다. 함수를 사용할 때 여전히 그렇습니까? 아니면 글로벌 데이터를 main에 넣은 다음 foo / bar / baz에 인수로 전달하는 것이 더 낫습니까? 모범 사례는 무엇입니까?
bodacydo

4
나는 논쟁을 선호한다. 이를 제외하고는 (예 : 또는 ) main바로 뒤에 또는 함수에서 전역 변수를 설정 합니다. 위에서 전역 변수를 설정 하지 않습니다 . 코드는 . mainsetupparseArgumentsmainmain
John Kugelman

이것은 무엇을 다소 유사 보인다 if _ _ name _ _ == "_ _ main _ _": main()파이썬에서와
세르지 Kolodyazhnyy에게

이것은 또한 Bats 와 같은 도구를 사용 하여 스크립트를 테스트 할 때 환상적입니다. 모든 것을 함수로 나누면 개별 구성 요소를 훨씬 쉽게 테스트 할 수 있습니다. 블로그 게시물
dragon788

31

bash 스크립트가 너무 커지면 포함 메커니즘을 사용합니다.

파일 allMyFunctions:

foo() {
}

bar() {
}

baz() {
}

파일 main:

#!/bin/bash

. allMyfunctions

foo
bar
baz

28
쉘 스크립트는 지난 1 파일을 성장 시작할 때 개인적으로, 나는 ;-) 다른 언어로 전환하는 경향이
요아킴 사우어

사용하는 것이 더 낫지 source allMyfunctions않습니까?
pydoge

4
@pydoge : sourcePOSIX 규격이 아닙니다. bashsource대한 별칭으로 정의합니다 .. 기능적으로 동일합니다.
mouviciel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.