부울 값을 반환할 때 함수 호출이 작동하지 않는 이유는 무엇입니까?

부울 값을 반환할 때 함수 호출이 작동하지 않는 이유는 무엇입니까?

내 함수 호출이 아래 if 조건에서 부울 값으로 평가되지 않는 이유는 무엇입니까?

함수 호출에서 반환할 때 숫자를 부울로 사용해야 합니까?

#!/bin/bash
#Script to wait for log file to start and open it using less
function is_log_started()
{
        if test -f "log/server.log"; then
                return true
        fi
        return false
}

if [ is_log_started = true ]; then
        echo "log started"
fi

답변1

셸 함수는 0에서 255 사이의 정수만 반환할 수 있습니다. 이는 실행 파일에 적용되는 것과 동일한 제한 사항입니다. 숫자가 아닌 인수를 전달하면 다른 쉘이 다르게 반응합니다. bash는 오류 메시지를 인쇄합니다.

$ bash -c 'f () { return true; }; f; echo $?'                    
bash: line 0: return: true: numeric argument required
2

프로그램을 종료할 때와 마찬가지로 true이면 0을, false이면 1에서 125 사이의 값을 전달합니다. 126에서 255 사이의 값도 거짓이지만 일반적인 의미(프로그램을 시작할 수 없거나 신호에 의해 프로그램이 종료됨)를 갖습니다.

function is_log_started()
{
        if test -f "log/server.log"; then
                return 0
        fi
        return 1
}

하지만 쓰는 방법이 복잡해요

function is_log_started
{
        test -f "log/server.log"
}

쉘 함수의 반환 상태는 마지막으로 실행된 명령문의 반환 상태입니다.

당신의 테스트도 잘못되었습니다. 및 가 동일한 문자열인지 [ is_log_started = true ]테스트합니다 . 함수 호출의 반환 상태가 true인지 테스트하려면 함수를 호출하기만 하면 됩니다. 모든 쉘 명령은 이미 부울입니다. 명령이 0을 반환하면 true이고 그렇지 않으면 false입니다.is_log_startedtrue

function is_log_started
{
        test -f "log/server.log"
}
if is_log_started; then
    echo "log started"
fi

답변2

이미 알고 계시겠지만 기능을 완전히 제거하고 다음을 사용해도 됩니다.

if [ -f "log/server.log" ] ; then echo "log started" ; fi

답변3

작성된 대로 문자열 "is_log_started"와 "true"를 비교하고 있으며 후자는 항상 false입니다.

테스트는 다음과 같아야 합니다.

if is_log_started; then

그리고 테스트를 완료하려면 함수가 실제로 true(0) 또는 false(예: 1)를 반환해야 합니다.

관련 정보