Raspbian: avalie cadeias de caracteres e / ou números condicionais

0

Estou com dificuldades para avaliar cadeias de caracteres e números condicionais. Depois de horas lendo e tentando com ( meu Guia de Iniciantes ) eu continuo recebendo as mensagens de erro como syntax error in conditional expression , unary operator expected , conditional binary operator expected etc ..

Algo está errado dentro da condição if - mas não entendi. Eu tentei com operadores aritméticos -ge , -le mas isso não funcionou também. Por favor, não se preocupe com a lógica discutível deste código-snip.

Trabalhando com o Raspbian (Debian) no meu Raspberry.

#!/bin/sh
NAME=syslogd
PID=/var/run/$NAME.pid
PIDofP='pidof $NAME'

    if [[ $PIDofP = "" ]]   #empty, at least not visible 
    then
        echo "   No process is running."
    fi

    if [[ $PIDofP < 1000 ]]
    then
        echo "   The PID-number is lower than 1000. ($PID: $PIDofP)"
    fi

    if [[ "$PIDofP" > 999 ]]
    then
        echo "   The PID-number is higher than 1000. ($PID: $PIDofP)"
    fi  
exit 0

Existe uma maneira de avaliar uma string, número, número inteiro ou o que quer que seja para aprender de que tipo é? Digamos que eu tenha um monte de números e / ou letras e queira saber sobre o 'formato' em que eles são mantidos - para ser usado depois, sem perder horas encontrando a sintaxe apropriada.

Desculpe, pela primeira vez escrevendo bash.script

    
por snahl 13.12.2015 / 13:56

1 resposta

1

O erro unary operator expected provavelmente foi devido a $PIDofP não estar entre aspas na condicional. Nesse caso, quando $PIDofP é uma string vazia, o shell não vê nenhum valor no lado esquerdo de = em vez de um valor em branco, daí a mensagem de erro.

O snippet a seguir implementa a lógica de comparação do PID corretamente por meio do uso de if / elif / else , o que garante que apenas uma das três possíveis echo de saídas seja gerada. Ele usa a sintaxe de comparação POSIX (consulte Qual é a diferença entre colchetes duplos e simples no bash? ).

#!/bin/sh
NAME=syslogd
PID=/var/run/$NAME.pid
PIDofP='pidof $NAME'
if [ "$PIDofP" = "" ]; then
    echo "   No process is running."
elif [ "$PIDofP" -lt 1000 ]; then
    echo "   The PID number is lower than 1000. ($PID: $PIDofP)"
else
    # $PIDofP is >= 1000.
    echo "   The PID number is 1000 or higher. ($PID: $PIDofP)"
fi
exit 0
    
por 13.12.2015 / 18:12