bash 함수에서 값 반환


10

숫자가 유효한 10 자리 숫자 인 경우 1을 반환하는 함수가 있습니다.

valNum()
{
    flag=1
    if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
        echo "Invalid Number"
        flag=0
    fi
    return $flag
}

다음에 의해 호출됩니다.

if [[ $(valNum $num) -eq 1 ]]; then
      #do something
fi

숫자가 유효하면 함수가 제대로 작동하지만 유효하지 않은 숫자를 입력하면 구문 오류가 표시됩니다.

답변:


14

@choroba의 대답은 정확하지만이 예제는 더 명확 할 수 있습니다.

valNum $num
valNumResult=$? # '$?' is the return value of the previous command
if [[ $valNumResult -eq 1 ]]
then
  : # do something
fi

이 예제는 조금 더 길지만 ( $valNumResult값을 설정 한 후 쿼리), 어떤 일이 발생하는지 더 명확하게 설명합니다. 즉 valNum(), 값 을 반환하고 해당 값을 쿼리하고 테스트 할 수 있습니다.

PS는 자신에게 부탁을하고 보내 주시기 바랍니다 0에 대한 true비 - 제로 false. 이렇게하면 실패한 경우 반환 값을 사용하여 "실패한 이유"를 나타낼 수 있습니다.


8

bash의 함수는 종료 코드 만 리턴 할 수 있습니다. 반대로 명령 대체는 명령 또는 함수의 표준 출력을 얻는 데 사용됩니다. 따라서 리턴 된 플래그를 확인하기 위해 대체가 필요하지 않습니다.

if valNum "$num" ; then
    # ...
fi

그러나 숫자가 유효하면 0을, 숫자가 유효하지 않으면 1을 리턴해야합니다 (종료 코드 0은 오류가 없음).


나는 그것을 얻지 못한다. tldp.org/LDP/abs/html/complexfunct.html 의 예제 24.7에서 함수는 종료 코드가 아닌 최대 값을 리턴합니다. 귀하의 제안이 효과가 있지만 그것이 왜 효과가 있는지 이해할 수 없습니다.
user2179293

1
테스트는 입력 즉, 참 또는 거짓 유효한 10 자리 정수인지 아닌지 알 수 있기 때문에, 함수가 반환 0 또는 1 choroba의 예는 때문에 작동 if valnum "$num"에 해당 if valnum "$num" = 0"그것이 사실 인 경우"예. sh 스크립팅의 기본 경험칙은 0 = true / 성공, 0이 아닌 = false / 오류입니다.
cas

2
BTW는 "Advanced Bash-Scripting Guide"는 그다지 좋은 안내서는 아니지만 많은 것들에 대해 잘못되어 있으며 일부 스크립팅 관행을 장려합니다. mywiki.wooledge.org/BashFAQ 의 Bash FAQ 는 훨씬 더 나은 리소스입니다.
cas


문자열 "유효하지 않은 숫자"를 에코하고 있기 때문에 함수가 실패한 다음 해당 문자열과 숫자 1 사이의 숫자 비교를 수행하여if [[ $(valNum $num) -eq 1 ]]
cas

5

쉘 함수에서 임의의 결과를 리턴 할 수 없습니다. 0과 255 사이의 정수인 상태 코드 만 반환 할 수 있습니다. (더 큰 값을 전달할 수 있지만 return모듈러스 256은 잘립니다.) 성공을 나타내려면 값이 0이어야하고 실패를 나타내려면 다른 값을 지정해야합니다. 일반적으로 높은 값은 특별한 의미를 갖기 때문에 1에서 125 사이의 오류 코드를 고수해야합니다 (126 및 127의 잘못된 외부 명령, 높은 값의 신호에 의해 종료 됨).

여기에 예 또는 아니오 결과를 반환하므로 상태 코드가 적합합니다. flag성공 또는 실패를 나타내는 것으로 보이 므로 성공에는 기존 값 0을, 실패에는 1을 사용해야합니다 (쓰기 한 것과 반대). 그런 다음 if 문에서 함수를 직접 사용할 수 있습니다.

valNum ()
{
  local flag=0
  if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
    echo 1>&2 "Invalid Number"
    flag=1
  fi
  return $flag
}
if valNum "$num"; then
  #do something
fi

실패 코드를 구별해야하는 경우 함수를 직접 호출하십시오. 오류가 발생한 직후 오류 코드를 사용할 수 있습니다 $?. 그런 다음 사례 진술로 확인할 수 있습니다.

valNum "$num"
case $? in 

나중에 상태 코드를 사용해야하는 $?경우 다음 명령으로 덮어 쓰기 전에 다른 변수에 저장하십시오 .

valNum "$num"
valNum_status=$?

명령 대체 $(…)가 함수 출력으로 확장되어 코드에서 오류 메시지이거나 비어 있기 때문에 작성하지 않았습니다 1.

쉘 코드에서 상태 코드가 허용하는 것보다 많은 정보를 전달해야하는 경우 다음 두 가지 가능성이 있습니다.

  • 표준 출력에 텍스트를 인쇄하고 명령 대체에서 함수를 호출하십시오. $(valNum "$num")
  • 함수 내에서 하나 이상의 변수를 할당하고 나중에 해당 변수를 읽습니다.

2

나는이 분야에서 필연적으로 결과를 얻었습니다. 다음은 실험적인 실험 결과입니다. 먼저 bash 또는 * nix 명령에 대한 몇 가지 ' 이론 ':

  • 성공 == 0 ... 즉. 오류 상태 코드 없음)
  • FAIL! = 0 ...... 일부 상태 코드

예:

if  ls -lt /nonexistantdir
then 
    echo "found"
else
    echo "FAIL"
fi
#
echo
ls -lt /nonexistantdir; echo "status = $?"
echo "status = $?"

산출:

ls: cannot access '/nonexistantdir': No such file or directory
FAIL... 

ls: cannot access '/nonexistantdir': No such file or directory
status = 2

표시된대로 ls명령은 상태 코드 = 2를 리턴합니다. 유효한 디렉토리를 시도하면 상태는 0 ( 0 )입니다. 거의 모든 다른 언어와 동일하지 않습니다.

규칙 # 1- 만들기 ...

  • 참 == 0
  • 거짓! = 0

Bash 문 에서 오류 코드를 테스트 하고 있음을 기억해야합니다 if. 상수를 설정하거나 쉘 true또는 false명령을 사용할 수 있습니다 .

TRUE=0
FALSE=1

#  valid number function
#
valNum()
{
    flag=$TRUE

    if [[ $1 != [1-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] ]]; then
        echo "Invalid Number"
        flag=$FALSE
    fi
    return $flag
}

#    later on ...
#
if validNum Abc 
then
    echo "Lucky number"
else
    echo "Not lucky."
fi

출력 :

Invalid Number
Not lucky.

그러나 그의 대답이 옳기 때문에 ' 투표 '@Gilles 를 제공하는 것이 좋습니다 . 나는 ePaper에 대한 단순한 측면을 원했습니다.

또 다른 하나는 test명령입니다. 이것은 다음과 같습니다

[[ some-expression ]]; 

대부분의 경우 그리고 예를 들면 :

$ test 1
$ echo "result = $?"
result = 0
$ test 0
$ echo "result = $?"
result = 0

Zero (0)은 true 입니다. 왜? 맨 페이지는 NULL이 아닌 경우 단일 인수가 ' true ' 라고 말합니다 .

참고 문헌 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.