Expression avalia como false em loop for, enquanto é verdade em if

1

Este comando gera o PID de processo escutando na porta 8083:

lsof -i4TCP:8083 -sTCP:LISTEN -t

Quando não há processo, ele retorna uma string vazia. Nenhum processo está sendo executado nessa porta, portanto, estou verificando se esse comando retorna cadeia vazia

if [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]; then
    echo "waiting for startup"
else
    echo "process is listening on port 8083"
fi

gera "aguardando inicialização" como esperado, mas quando estou fazendo isso:

for (( ; -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ; )); do
    echo "waiting for startup"
    sleep 1
done

não produz nada, mas essa condição era verdadeira quando era avaliada em if , então, se for verdade, esse loop deve executar do...done block e imprimir "processing", mas isso não ocorre e sai imediatamente. Por que isso acontece?

    
por ctomek 21.03.2018 / 14:11

2 respostas

3

[[ … ]] avalia uma expressão condicional . Em uma expressão condicional, -z é um operador que recebe uma string como argumento e retorna true se a string estiver vazia e, caso contrário, false.

Em for ((…; …; …)) , cada uma das três partes separadas por ponto-e-vírgula dentro dos parênteses duplos é um expressão aritmética . Em uma expressão aritmética, - é o operador de negação ou subtração. z é uma referência para a variável z , avaliando para 0 se a variável não estiver definida. Portanto, quando a saída de lsof -i4TCP:8083 -sTCP:LISTEN -t estiver vazia e z não estiver definida, a expressão será avaliada como 0, portanto, o loop será encerrado. Quando a saída não está vazia, é provável que resulte em um erro de sintaxe na expressão aritmética. O que você escreveu simplesmente não faz sentido em uma expressão aritmética.

Esta forma de for é projetada para iterações determinadas pela aritmética, normalmente contando de algum valor inicial para algum valor final. Você parece querer um loop while, então escreva um loop while e use uma expressão condicional.

while [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]; do
    echo "waiting for startup"
    sleep 1
done

Veja também parênteses, colchetes e chaves no bash .

    
por 22.03.2018 / 00:09
3

Por que você está usando um loop for em vez de while ?

while [[ -z $(lsof -i4TCP:8083 -sTCP:LISTEN -t) ]]
do
    echo "waiting for startup"
    sleep 1
done
    
por 21.03.2018 / 14:19

Tags