Write shell scripts that survive contact with a real machine. Variables, quoting, exit status, loops, functions, and redirection — in portable POSIX sh, the shell that exists in every container and CI image.