아래에 선언된 함수를 호출합니다.

아래에 선언된 함수를 호출합니다.

bash에서 아래에 선언된 함수를 호출할 수 있습니까?

if [ "$input" = "yes" ]; then
    YES_FUNCTION
elif [ "$input" = "no" ]; then
    NO_FUNCTION
else
    exit 0;
fi

YES_FUNCTION()
{
  .....
  .....
}

NO_FUNCTION()
{
  .....
  .....
}

답변1

다른 사람들이 말했듯이, 당신은 그렇게 할 수 없습니다.

그러나 기본 프로그램이 파일 맨 위에 있고 다른 함수가 아래에 정의되도록 코드를 파일로 정렬하려면 별도의 함수를 사용하여 main이를 수행 할 수 있습니다.

예를 들어

#!/bin/sh

main() {
    if [ "$1" = yes ]; then
        do_task_this
    else
        do_task_that
    fi
}

do_task_this() {
    ...
} 
do_task_that() {
    ...
} 

main "$@"; exit

main파일 끝에서 호출 하면 모든 함수가 이미 정의되어 있습니다. 함수에 스크립트의 명령줄 인수가 표시되도록 하려면 명시적 "$@"으로 에 전달해야 합니다.main

main 호출과 같은 줄에 명시적으로 작성하는 것은 exit필수는 아니지만, 스크립트 파일이 수정될 경우 실행 중인 스크립트가 혼동되는 것을 방지하는 데 사용할 수 있습니다. 이것이 없으면 쉘은 를 반환한 후 스크립트 파일에서 명령 읽기를 계속 시도합니다 main. (바라보다실행하기 전에 전체 쉘 스크립트를 읽는 방법은 무엇입니까?)

답변2

아니요, 이러한 함수는 호출 시 쉘 환경에 존재해야 합니다.

구글의쉘 스타일 가이드이 문제에 대한 해결책이 있습니다:

충분히 긴 스크립트의 경우 main하나 이상의 다른 함수가 포함된 함수를 호출해야 합니다.

스크립트가 끝나면 모든 함수가 끝난 후 함수에 포함되지 않은 유일한 명령문은 다음과 같습니다.

main "$@"

그러면 main스크립트에 지정된 매개변수를 사용하여 함수가 호출됩니다. 함수 main는 스크립트의 맨 위에 있을 수 있습니다(스타일 가이드에서는 맨 아래에 넣으라고 되어 있지만, 다시 말하면 많은 내용이 나와 있습니다).

쉘이 호출을 수행하면 main스크립트의 모든 함수가 구문 분석되므로 main함수 내에서 호출할 수 있습니다.

답변3

아니요. 함수를 사용하려면 먼저 선언해야 합니다. 쉘 스크립트는 한 줄씩 읽고 실행되므로 함수는 선언이 실행될 때까지 존재하지 않습니다.

답변4

declaring쉘에는 기능 개념이 없습니다 . 따라서 미래 지향적인 진술을 할 수 없습니다.

따라서 호출하기 전에 쉘이 함수 구현을 읽도록 해야 합니다.

관련 정보