Bash 변수에서 로컬 값을 반환하시겠습니까?

Bash 변수에서 로컬 값을 반환하시겠습니까?

나는이 기사를 조사했습니다.Bash 함수의 반환 값. 데이터

Lorem.
\begin{document}
hello
\end{document}

사례 # 1이 작동하지 않습니다

암호

#!/bin/bash
function getStart {
        local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
}

START2=$(getStart)
echo $START2

빈 줄을 잘못 반환합니다. 나는 예측한다 1. 스크립트가 빈 줄을 반환하는 이유는 무엇입니까?

사례 #2 작동

암호

#!/bin/bash
function getStart {
        local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
        echo $START
}

getStart

올바르게 인쇄됩니다 1.

초로바 답변 출력

#!/bin/bash
function getStart {
        local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
        echo $START
}

START2=$(getStart)
echo $START2

줄 번호는 한 번만 제공되며 이는 예상된 결과가 아닙니다. 두 번은 해야 할 것 같아요.

답변1

$(...)(일명 "명령 대체")는 명령의 출력을 캡처합니다 .... 변수에 값을 할당하면 출력이 생성되지 않으므로 캡처할 내용이 없습니다. #2의 경우 echo출력이 생성됩니다.

getStart () {
    local l=Hallo
    echo $l
}

v=$(getStart)
echo $v

업데이트에 응답하려면: function output Hallo이 출력은 명령 대체에 의해 캡처됩니다. 왜냐하면 그것이 명령 대체의 역할이기 때문입니다. 따라서 v=$(getStart)스크립트는 그때까지 어떤 출력도 생성하지 않습니다. 그런 다음 해당 행이 echo $v출력됩니다 Hallo.

답변2

그냥 awk 명령을 실행하고 캡처하는 것을 잊어버리세요. 함수는 무언가를 에코할 수 있으며 추가로 종료 상태를 반환합니다. 명시적으로 반환하지 않으면(예: return 1) 함수의 종료 상태는 마지막 명령의 종료 상태가 됩니다. 이것이 아마도 함수에서 캡처 + 에코를 원하지 않는 이유입니다. 에코 종료 상태(예외가 없는 한 0)를 사용하여 캡처 명령의 종료 상태를 숨깁니다.

답변3

local+를 통해 변수에서 -ness를 제거하는 간단한 함수를 사용할 수 있습니다 .unsetset

function return_local()
{
  unset $1 # must be local
  eval "$1=\"\$2\""
}

evalnot을 사용해야 합니다. declare왜냐하면 로컬이 아닌 내보내지지 않은 변수를 생성해야 할 때 로컬 변수나 내보낸 변수를 생성하기 때문입니다.

function test()
{
  local my_return_value=123
  # ...
  return_local my_return_value "$my_return_value"
}

unset지시문은 가장 안쪽 변수를 제거하므로 지역 변수를 반환하려는 모든 함수에 작성 local해야 합니다 . return_local따라서 return_local중첩된 호출 컨텍스트에서 사용할 수 있습니다.

$(...)별도의 프로세스를 생성하기만 하면 연산자를 사용할 필요가 없어져 프로세스 생성 비용이 저렴하지 않은 Windows에서 bash의 성능이 저하됩니다.

관련 정보