다른 답변의 문제는 전역을 사용 echo
한다는 것입니다.이 함수는 호출 체인에 여러 함수가있을 때 덮어 쓸 수 있거나 함수가 진단 정보를 출력 할 수 없다는 것을 의미합니다 (함수는이 기능을 수행하지 않고 "결과"를 반환합니다. 가치, 발신자가 기대하는 것보다 많은 정보를 포함하여 이상한 버그로 이어 지거나 eval
너무 무겁고 해킹 적입니다.
이를 수행하는 올바른 방법은 최상위 레벨 항목을 함수에 넣고 local
with bash의 동적 범위 지정 규칙을 사용하는 것 입니다. 예:
func1()
{
ret_val=hi
}
func2()
{
ret_val=bye
}
func3()
{
local ret_val=nothing
echo $ret_val
func1
echo $ret_val
func2
echo $ret_val
}
func3
이 출력
nothing
hi
bye
동적 범위 지정 ret_val
은 발신자에 따라 다른 객체 를 가리키는 것을 의미 합니다! 이것은 대부분의 프로그래밍 언어가 사용하는 어휘 범위와 다릅니다. 이것은 실제로 문서화 된 기능 이며 놓치기 쉽고 잘 설명되어 있지 않습니다. 여기에 대한 문서가 있습니다 (강조는 내 것입니다).
함수에 로컬 인 변수는 로컬 내장으로 선언 될 수 있습니다. 이러한 변수는 함수 와 호출하는 명령 에만 표시됩니다 .
는 C / C ++ / 파이썬 / 자바 / C #을 / 자바 스크립트 배경을 가진 사람의 경우, 이것은 가장 큰 장애물은 아마도 : bash는 함수는 명령하고, 같은 행동, 기능하지 않은 : 그들은 출력 할 수 stdout
/ stderr
, 그들은 파이프에서와 수 / out, 종료 코드를 반환 할 수 있습니다. 기본적으로 스크립트에서 명령을 정의하는 것과 명령 줄에서 호출 할 수있는 실행 파일을 만드는 것에는 차이가 없습니다.
따라서 다음과 같이 스크립트를 작성하는 대신
top-level code
bunch of functions
more top-level code
다음과 같이 작성하십시오.
# define your main, containing all top-level code
main()
bunch of functions
# call main
main
여기서 as를 main()
선언 하고 다른 모든 함수 는 ret_val
을 local
통해 값을 반환합니다 ret_val
.
다음 유닉스 및 리눅스 질문 : 셸 함수의 로컬 변수 범위를 참조하십시오 .
상황에 따라 더 나은 솔루션 중 하나 는 ya.teck 이 게시 한 솔루션 입니다 local -n
.
return
귀하의 경우 기본적으로의exit code
범위 와 동일0 - 255
합니다.echo
@septi가 제안한대로 사용하십시오 . 로 종료 코드를 캡처 할 수 있습니다$?
.