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 

숫자가 유효하지만 구문이 표시되면 함수가 제대로 작동합니다. 잘못된 숫자를 입력하면 오류가 발생합니다.

답변

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

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

이 예는 조금 더 길지만 ($valNumResult를 설정 한 다음 해당 값을 쿼리 함) 발생하는 상황을보다 명확하게 설명합니다. valNum()는 값을 반환하며 해당 값은 쿼리 및 테스트 할 수 있습니다.

PS 부탁을 들어서 0truefalse의 경우 0이 아닙니다. 이렇게하면 반환 값을 사용하여 실패 사례에서 실패한 이유를 나타낼 수 있습니다.

Answer

bash의 함수는 종료 코드 만 반환 할 수 있습니다. 반대로 명령 대체는 다음의 표준 출력을 가져 오는 데 사용됩니다. 따라서 반환 된 플래그를 확인하려면 대체 할 필요가 없습니다.

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

하지만 작동하려면 0을 반환해야합니다. 번호가 유효합니다. 그렇지 않은 경우 1 (종료 코드 0은 오류 없음을 의미 함).

댓글

  • 알 수 없습니다. tldp.org/LDP/abs/html/complexfunct.html 의 예제 24.7에서 함수는 종료 코드가 아닌 최대 값을 반환합니다. 귀하의 제안은 작동하지만 작동하는 이유를 이해할 수 없습니다
  • 테스트는 입력이 유효한 10 자리 정수인지 여부 (예 : 참 또는 거짓)를 알아내는 것이기 때문에 함수 0 또는 1을 반환합니다. choroba '의 예제는 if valnum "$num"if valnum "$num" = 0와 동일하기 때문에 작동합니다. 예 : " 참인 경우 ". sh 스크립팅의 기본 경험 규칙은 0 = 참 / 성공, 0이 아닌 경우 = 거짓 / 오류입니다.
  • BTW, 해당 " 고급 Bash 스크립팅 가이드 "는 ' 매우 좋은 가이드가 아닙니다. ' 많은 일에 대해 잘못되었습니다. 불량한 스크립팅 관행을 장려합니다. mywiki.wooledge.org/BashFAQ 의 Bash FAQ가 훨씬 더 나은 리소스입니다.
  • unix.stackexchange.com/questions/12236/ …
  • " 잘못된 숫자 " 그런 다음 if [[ $(valNum $num) -eq 1 ]]

Answer

셸 함수에서 임의의 결과를 반환 할 수 없습니다. 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")
  • 함수 내에서 하나 이상의 변수에 할당하고 나중에 해당 변수를 읽습니다.

답변

나도이 영역에서 상충되는 결과가 있습니다. 다음은 제 경험적 실험의 결과입니다.먼저 bash 또는 * nix 명령에 대한 “ 이론 “:

  • SUCCESS == 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 -만들기 …

  • TRUE   == 0
  • FALSE! = 0

우리는 Bash iv id에서 오류 코드를 테스트 하고 있음을 기억해야합니다. = “669649a910″>

문. 상수를 설정하거나 쉘 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. 

그러나 “ up-vote “@Gilles의 대답이 맞기 때문입니다. ePaper에 대한 단순한면을 낮추고 싶었습니다.

다른 한 가지, test 명령. 다음과 같이 표시됩니다.

[[ some-expression ]]; 

대부분. 예 :

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

Zero (0)는 true

. 왜? man 페이지에서는 단일 인수가 NULL이 아닐 때 “ true “라고 말합니다.

참조 :

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다