[shell] 쉘 스크립트에서 호출 된 함수의 값 반환
쉘 스크립트에서 호출 된 함수에서 값을 반환하고 싶습니다. 아마도 구문이 누락되었습니다. 전역 변수를 사용해 보았습니다. 그러나 그것은 또한 작동하지 않습니다. 코드는 다음과 같습니다.
lockdir="somedir"
test() {
retval=""
if mkdir "$lockdir"
then # Directory did not exist, but it was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval="true"
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval="false"
fi
return retval
}
retval=test()
if [ "$retval" == "true" ]
then
echo "directory not created"
else
echo "directory already created"
fi
답변
Bash 함수는 원하는대로 문자열을 직접 반환 할 수 없습니다. 다음 세 가지를 수행 할 수 있습니다.
- 문자열을 에코
- 문자열이 아닌 숫자 인 종료 상태를 반환합니다.
- 변수 공유
이것은 다른 쉘에도 해당됩니다.
각 옵션을 수행하는 방법은 다음과 같습니다.
1. 에코 스트링
lockdir="somedir"
testlock(){
retval=""
if mkdir "$lockdir"
then # Directory did not exist, but it was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval="true"
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval="false"
fi
echo "$retval"
}
retval=$( testlock )
if [ "$retval" == "true" ]
then
echo "directory not created"
else
echo "directory already created"
fi
2. 반환 종료 상태
lockdir="somedir"
testlock(){
if mkdir "$lockdir"
then # Directory did not exist, but was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval=0
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval=1
fi
return "$retval"
}
testlock
retval=$?
if [ "$retval" == 0 ]
then
echo "directory not created"
else
echo "directory already created"
fi
3. 변수 공유
lockdir="somedir"
retval=-1
testlock(){
if mkdir "$lockdir"
then # Directory did not exist, but it was created successfully
echo >&2 "successfully acquired lock: $lockdir"
retval=0
else
echo >&2 "cannot acquire lock, giving up on $lockdir"
retval=1
fi
}
testlock
if [ "$retval" == 0 ]
then
echo "directory not created"
else
echo "directory already created"
fi
답변
당신은 너무 열심히 일하고 있습니다. 전체 스크립트는 다음과 같아야합니다.
if mkdir "$lockdir" 2> /dev/null; then
echo lock acquired
else
echo could not acquire lock >&2
fi
그러나 그것조차 아마 너무 장황 할 것입니다. 나는 그것을 코딩 할 것이다 :
mkdir "$lockdir" || exit 1
그러나 결과 오류 메시지는 약간 모호합니다.
답변
단지 참 / 거짓 테스트라면 return 0
성공과 return 1
실패를위한 기능 을 갖추십시오 . 테스트는 다음과 같습니다.
if function_name; then
do something
else
error condition
fi
답변
나는 실패 (glenn jackman)에 대해 succ / 1에 대해 0을 반환한다고 생각하고 olibre의 명확하고 설명적인 대답은 모든 것을 말합니다. 결과가 바이너리가 아니고 결과를 “반향”하는 것보다 변수를 설정하는 것을 선호하는 경우에 대한 일종의 “콤보”접근 방식을 언급하기 만하면됩니다 (예를 들어 함수가 무언가를 에코한다고 가정하면이 접근 방식은 작동하지). 그럼 뭐야? (아래는 Bourne Shell)
# Syntax _w (wrapReturn)
# arg1 : method to wrap
# arg2 : variable to set
_w(){
eval $1
read $2 <<EOF
$?
EOF
eval $2=\$$2
}
에서와 같이 (예, 예는 다소 어리 석습니다. 단지 .. 예입니다)
getDay(){
d=`date '+%d'`
[ $d -gt 255 ] && echo "Oh no a return value is 0-255!" && BAIL=0 # this will of course never happen, it's just to clarify the nature of returns
return $d
}
dayzToSalary(){
daysLeft=0
if [ $1 -lt 26 ]; then
daysLeft=`expr 25 - $1`
else
lastDayInMonth=`date -d "`date +%Y%m01` +1 month -1 day" +%d`
rest=`expr $lastDayInMonth - 25`
daysLeft=`expr 25 + $rest`
fi
echo "Mate, it's another $daysLeft days.."
}
# main
_w getDay DAY # call getDay, save the result in the DAY variable
dayzToSalary $DAY
답변
함수에 전달할 매개 변수가 있고 값을 반환하려는 경우. 여기서는 “12345”를 함수에 대한 인수로 전달하고 VALUE에 할당 될 반환 변수 XYZ를 처리 한 후
#!/bin/bash
getValue()
{
ABC=$1
XYZ="something"$ABC
echo $XYZ
}
VALUE=$( getValue "12345" )
echo $VALUE
산출:
something12345