Por que minha chamada de função não está funcionando ao retornar um booleano?

4

Por que minha chamada de função não está avaliando como booleano na condição if abaixo?

Você precisa usar valores numéricos para booleano ao retornar da chamada de função?

#!/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
    
por chinto 28.09.2015 / 01:30

3 respostas

7

Você só pode retornar um inteiro entre 0 e 255 de uma função do shell. Essa é a mesma restrição que se aplica a um executável. Diferentes shells reagem diferentemente se você passar um argumento não numérico; o bash imprime uma mensagem de erro.

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

Passe 0 para verdadeiro e qualquer valor de 1 a 125 para falso, igual a quando sair de um programa. Os valores de 126 a 255 também são falsos, mas eles têm um significado convencional (incapaz de iniciar um programa ou programa morto por um sinal).

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

Mas esta é uma maneira complexa de escrever

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

O status de retorno de uma função de shell é o status de retorno da última instrução executada.

Seu teste também está errado. [ is_log_started = true ] testa se is_log_started e true são a mesma cadeia. Para testar se o status de retorno de uma chamada de função é true, basta chamar a função. Cada comando do shell já é um booleano: true se o comando retornar 0, caso contrário, false.

function is_log_started
{
        test -f "log/server.log"
}
if is_log_started; then
    echo "log started"
fi
    
por 28.09.2015 / 01:43
2

Como está escrito, você está comparando as strings "is_log_started" e "true", que são sempre falsas.

Seu teste deve ser:

if is_log_started; then

e sua função deve retornar true (0) ou false (por exemplo, 1) para o teste ser concluído.

    
por 28.09.2015 / 01:43
2

Você já deve saber disso, mas pode tirar toda a função e usar:

if [ -f "log/server.log" ] ; then echo "log started" ; fi
    
por 28.09.2015 / 10:49