분기하지 않고 bash 함수에서 문자열을 반환하는 방법은 무엇입니까?

분기하지 않고 bash 함수에서 문자열을 반환하는 방법은 무엇입니까?

나는 내 기능을 가지고있다

fun() {
    local result
    ...complex calculations...
    echo "$result"
}

물론 다음과 같은 명령 대체를 통해 호출할 수 있습니다.

something="$(fun)"

그러나 그것은 내가 원하는 것이 아닙니다. 불필요하게 포크되어 fun서브쉘에서 실행되려고 합니다.

$result포크 없이 사용하고 싶어요 .

간단한 솔루션(에서 전역 변수 설정) 외에 fun()무엇을 할 수 있나요?

답변1

결과를 반환할 변수 이름을 함수에 지정합니다.

foo () {
    declare -n result="$1"

    # stuff that sets result
    result='Hello world'
}

foo myvar1
foo myvar2

# Will print "Hello world" twice:
echo "$myvar1"
echo "$myvar2"

이 변수 result는 이름 참조 변수이며 foo함수 내에서 이에 대한 모든 참조는 이름이 함수의 첫 번째 인수로 제공되는 변수를 참조합니다.

이를 위해서는 bash버전 4.3 이상이 필요합니다.

답변2

나는 단지 간단한 함수에서 값을 반환하고 호출 직후에 값을 얻기 위해 전역을 사용합니다. 예를 들어 "아웃"

좋다

    foo() {
      local a='Hello World'
      a="${a% *}" # some work
      OUT="$a"
    }

   foo; myVar="$OUT"

관련 정보