Aciona um código de saída diferente de zero quando eu saio de um loop

1

Gostaria de executar uma série de tarefas, mas parar caso alguma delas falhasse, por isso escrevi (algo como):

for task in [TASKS]; do
  process "$task" || break
  commit "$task"
done

Isso funciona bem, mas (como especificado ) o status de saída de esse loop é zero mesmo se quebrarmos cedo. Idealmente, break -ing seria capaz de transmitir a falha.

Eu sei que retornar 0 é o comportamento documentado de break , mas estou curioso para saber se existem soluções alternativas relativamente limpas. O melhor que posso imaginar é envolver isso em uma função e definir uma variável didBreak e usar isso como o status de saída (da função). Funcionaria, mas parece excessivamente complexo.

    
por dimo414 27.01.2017 / 23:17

2 respostas

1

Você poderia fazer algo como

for t in $tasks; do
  process "$t" || { failed=1; break; }
  commit "$t"
done

if (( failed )); then
   echo "Failed something" >&2
fi
    
por 27.01.2017 / 23:23
0

Minha solução imaginada é:

run_til_failure() {
  local didBreak=0
  for task in [TASKS]; do
    process "$task" || { didBreak=1; break; }
    commit "$task"
  done
  local loopExit=$?
  if (( loopExit )); then return $loopExit; fi
  return $didBreak
}
    
por 27.01.2017 / 23:23