if [ ... ];
echo "in downtime, exit";
then exit
fi
Como as outras respostas mencionam, a palavra-chave then está no lugar errado nessa condição if . (Não está faltando, do ponto de vista da linguagem shell. Se fosse, isso seria um erro de sintaxe.)
O que acontece aqui, é que os comandos ambos antes de then são considerados como parte da condição, e o valor de retorno de todo o lote é usado para escolher se a peça está em then corre. Com comandos separados por ponto-e-vírgula, apenas o status de saída do último comando é importante.
Como echo provavelmente será sempre bem-sucedido, a ramificação condicional sempre será executada. Algo como if true; false; then echo something; fi nunca executaria o echo . Sugiro colocar a palavra-chave then na mesma linha que a condição, para evitar adicionar algo acidentalmente entre elas.
Com if , o uso de vários comandos na condição provavelmente será confuso, mas com while pode ter seus usos: poderíamos ter algo assim:
while value=$(somecommand) ; [ "$value" != 0 ] ; do
echo "do some work with $value"
done
Tanto a atribuição quanto o teste são executados em cada iteração do loop.