As respostas sobre o loop são boas maneiras de lidar com isso. Mas, para referência, não há nada de errado em fazer com que o script seja invocado novamente, portanto, /usr/local/bin/myscript
poderia ler:
#!/bin/sh
...
if [ yes = "$answer" ]; then
/usr/local/bin/myscript
fi
Você não precisa de um exit 0
no outro caso porque isso acontecerá automaticamente. Além disso, se você souber que está no mesmo diretório de trabalho no final do script como estava no início, poderá evitar codificar o caminho do script usando apenas $0
.
Há um último refinamento que é importante. Conforme escrito, o processo de script iniciado inicialmente gerará um segundo e aguardará a conclusão; o segundo pode então gerar um terceiro e esperar que ele termine; e assim por diante. Isso consome recursos e realmente não há trabalho para esses scripts fazerem quando sua descendência sair. Então você faria melhor para executá-los usando o equivalente a um "tail-call" na programação. Isso é feito usando o comando exec
:
#!/bin/sh
...
if [ yes = "$answer" ]; then
exec /usr/local/bin/myscript # or exec $0
fi
Isso funciona exatamente como antes, exceto que o primeiro processo sai quando começa o segundo, e quando o segundo termina, se ele não gerou um terceiro processo, voltamos diretamente para quem iniciou o primeiro processo, presumivelmente o concha.