The builtin command
exit exits the shell (from Bash's reference):
Exit the shell, returning a status of n to the shell’s
parent. If n is omitted, the exit status is that of the last command
executed. Any trap on EXIT is executed before the shell terminates.
Running to the end of file also exits, returning the return code of the last command, so yes, a final
exit 0 will make the script exit with successful status regardless of the exit status of the previous commands. (That is, assuming the script reaches the final
exit.) At the end of a script you could also use
: to get an exit code of zero.
Of course more often you'd use
exit from inside an
if to end the script in the middle.
These should print a 1 (
$? contains the exit code returned by the previous command):
sh -c "false" ; echo $?
sh -c "false; exit" ; echo $?
While this should print a 0:
sh -c "false; exit 0" ; echo $?
I'm not sure if the concept of the script "failing" when executing an
exit makes sense, as it's quite possible to some commands ran by the script to fail, but the script itself to succeed. It's up to the author of the script to decide what is a success and what isn't.
Also, the standard range for exit codes is 0..255. Codes above 127 are used by the shell to indicate a process terminated by a signal, but they can be returned in the usual way. The
wait system call actually returns a wider value, with the rest containing status bits set by the operating system.