숫자가 유효한 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 부탁을 들어서 0
를 true
및 false
의 경우 0이 아닙니다. 이렇게하면 반환 값을 사용하여 실패 사례에서 실패한 이유를 나타낼 수 있습니다.
Answer
bash의 함수는 종료 코드 만 반환 할 수 있습니다. 반대로 명령 대체는 다음의 표준 출력을 가져 오는 데 사용됩니다. 따라서 반환 된 플래그를 확인하려면 대체 할 필요가 없습니다.
if valNum "$num" ; then # ... fi
하지만 작동하려면 0을 반환해야합니다. 번호가 유효합니다. 그렇지 않은 경우 1 (종료 코드 0은 오류 없음을 의미 함).
댓글
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 “라고 말합니다. 참조 :
if valnum "$num"
가if valnum "$num" = 0
와 동일하기 때문에 작동합니다. 예 : " 참인 경우 ". sh 스크립팅의 기본 경험 규칙은 0 = 참 / 성공, 0이 아닌 경우 = 거짓 / 오류입니다.if [[ $(valNum $num) -eq 1 ]]