Bash 함수에서 값을 반환합니다.

Bash 함수에서 값을 반환합니다.

숫자가 유효한 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

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

답변1

@choroba의 답변은 정확하지만 이 예를 통해 더 명확해질 수 있습니다.

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

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

추신 부탁드립니다. 0합계 true를 0이 아닌 값 으로 반환해 주세요 false. 이렇게 하면 반환 값을 사용하여 실패 사례에서 "실패한 이유"를 나타낼 수 있습니다.

답변2

Bash의 함수는 종료 코드만 반환할 수 있습니다. 대조적으로, 명령 대체는 명령이나 기능의 표준 출력을 얻는 데 사용됩니다. 따라서 반환된 플래그를 확인하기 위해 다음을 바꿀 필요가 없습니다.

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

그러나 이것이 제대로 작동하려면 숫자가 유효하면 0을 반환하고 유효하지 않으면 1을 반환해야 합니다. 종료 코드 0은 오류가 없음을 의미합니다.

답변3

쉘 함수에서는 임의의 결과를 반환할 수 없습니다. 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

오류 코드를 구별해야 하는 경우 이 기능을 직접 호출하십시오. 반품 직후 에서 실패 코드를 확인할 수 있습니다 $?. 그런 다음 Case 문을 사용하여 확인할 수 있습니다.

valNum "$num"
case $? in …

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

valNum "$num"
valNum_status=$?

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

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

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

답변4

나 자신도 이 분야에서 상충되는 결과를 얻었습니다. 이것이 나의 경험적 실험의 결과이다. 첫째, 일부'이론' 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 왜냐하면 그의 대답이 정확하기 때문입니다. 나는 전자 종이의 단순한 측면을 다루고 싶었습니다.

또 다른 점은test주문하다. 이것은 다음과 같습니다:

[[ some-expression ]]; 

대부분의 경우. 예를 들어:

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

제로(0)는진짜. 왜? 맨 페이지에는 단일 인수가 '진짜' NOT-NULL일 때.

인용하다:

관련 정보