
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
쉘에는 기능 개념이 없습니다 . 따라서 미래 지향적인 진술을 할 수 없습니다.
따라서 호출하기 전에 쉘이 함수 구현을 읽도록 해야 합니다.