Programming

쉘 스크립트에서 호출 된 함수에서 값 반환

procodes 2020. 7. 26. 13:58
반응형

쉘 스크립트에서 호출 된 함수에서 값 반환


쉘 스크립트에서 호출 된 함수에서 값을 반환하고 싶습니다. 아마도 구문이 누락되었을 수 있습니다. 전역 변수를 사용해 보았습니다. 그러나 그것은 또한 작동하지 않습니다. 코드는 다음과 같습니다

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

I think returning 0 for succ/1 for fail (glenn jackman) and olibre's clear and explanatory answer says it all; just to mention a kind of "combo" approach for cases where results are not binary and you'd prefer to set a variable rather than "echoing out" a result (for instance if your function is ALSO suppose to echo something, this approach will not work). What then? (below is Bourne Shell)

# Syntax _w (wrapReturn)
# arg1 : method to wrap
# arg2 : variable to set
_w(){
eval $1
read $2 <<EOF
$?
EOF
eval $2=\$$2
}

as in (yep, the example is somewhat silly, it's just an.. example)

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

참고URL : https://stackoverflow.com/questions/8742783/returning-value-from-called-function-in-a-shell-script

반응형