[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. 문자열을 에코
  2. 문자열이 아닌 숫자 인 종료 상태를 반환합니다.
  3. 변수 공유

이것은 다른 쉘에도 해당됩니다.

각 옵션을 수행하는 방법은 다음과 같습니다.

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


답변