나는이 기사를 조사했습니다.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를 제거하는 간단한 함수를 사용할 수 있습니다 .unset
set
function return_local()
{
unset $1 # must be local
eval "$1=\"\$2\""
}
eval
not을 사용해야 합니다. declare
왜냐하면 로컬이 아닌 내보내지지 않은 변수를 생성해야 할 때 로컬 변수나 내보낸 변수를 생성하기 때문입니다.
function test()
{
local my_return_value=123
# ...
return_local my_return_value "$my_return_value"
}
이 unset
지시문은 가장 안쪽 변수를 제거하므로 지역 변수를 반환하려는 모든 함수에 작성 local
해야 합니다 . return_local
따라서 return_local
중첩된 호출 컨텍스트에서 사용할 수 있습니다.
$(...)
별도의 프로세스를 생성하기만 하면 연산자를 사용할 필요가 없어져 프로세스 생성 비용이 저렴하지 않은 Windows에서 bash의 성능이 저하됩니다.