Você pode querer reescrever seu código para que fique assim:
while: ; do
case $step in
0) command_1 && ((step++)) ;;
1) command_2 && ((step++)) ;;
...
9) command_9 && step=0 ;;
*) echo "ERROR" >&2 ; exit 1 ;;
esac
done
Então você estaria ciente do que foi feito testando o valor de
step . Então, você pode querer definir uma
trap antes do while loop é executado, de modo que, ao sair, o valor de step é gravado em um arquivo de log:trap "echo step=$step > log_file" EXIT
Então, tudo que você precisa fazer é
source o arquivo de log no início do script, e o último continuará seu trabalho onde foi interrompido.