숫자가 유효한 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일 때.
인용하다: