Se você precisar repetir o script indefinidamente, use um aninhado while
loop:
while true; do
# Do something, for example output the current date and time:
printf '%(%c)T\r' -1
done
-
Em seu código de exemplo, você está usando o estilo antigo para quebra de saída de sub-shells. Como diz o @ThomasWard : "a maioria dos guias de Bash não recomendam o uso de backticks e, em vez disso, sugerem comandos dentro de
$( )
, ou seja,$(monStatus.sh -p appName:Tomcat | head -2 | tail -1 | nawk '{print $2}')
. Esta é realmente a maneira mais recomendada de fazer a captura de saída de subshell como uma variável ou como substituição hoje em dia. "Como @dessert diz, "note que há realmente uma diferença entre os backticks e a sintaxe
$(…)
: quando o é usada a forma de substituição backquote de estilo antigo, a contrabarra retém seu significado literal, exceto quando seguida por$
,'
ou\
- compare as saídas deecho $(echo \ )
eecho 'echo \ '
! " -
Além disso, você pode simplificar mais algumas coisas:
Use
nawk 'FNR==2{print $2}'
em vez dehead -2 | tail -1 | nawk '{print $2}'
.Use o teste interno de Bash em
[
(consulteman test
e this resposta), o 'e' operador de lista&&
e positivo (==
,-eq
) em vez de condição negativa (!=
,-ne
).#!/bin/bash while true; do sleep 90 [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') == 'offline' ]] && RestartTomcat.sh done
Mas, de acordo com o comentário "após a reinicialização, ele deve terminar" , a sugestão correta é usar while
com uma condição:
#!/bin/bash
while [[ $(monStatus.sh -p appName:Tomcat | nawk 'FNR==2{print $2}') -ne offline ]]
do
sleep 90
done
RestartTomcat.sh
Ou, se você quiser usar uma condição positiva, o loop until
pode ser implementado da mesma maneira:
#!/bin/bash
until [[ $(...) -eq offline ]]; do sleep 90; done; RestartTomcat.sh