O problema é provavelmente o set -e
:
Exit immediately if a pipeline (which may consist of a single simple command), a subshell command enclosed in parentheses, or one of the commands executed as part of a command list enclosed by braces (see SHELL GRAMMAR above) exits with a non-zero status. The shell does not exit if the command that fails is part of the command list immediately following a while or until keyword, part of the test following the if or elif reserved words, part of any command executed in a && or || list except the command following the final && or ||, any command in a pipeline but the last, or if the command's return value is being inverted with !.
Assim, quase todos os comandos podem fazer o script sair com um código de saída diferente de zero.
Um problema especial que você talvez não saiba: o let COUNT-=1
tem o código de saída 1 se o resultado for 0. Ou seja, se o script não tiver executado exit 0
antes, ele deverá falhar.
Você pode resolver este problema, por exemplo com:
let COUNT-=1 || true
Mas a questão principal é, claro: o que o set -e
está fazendo lá? E quem usa isso sem entender as consequências ...