POSIX #!/bin/sh

When writing shell scripts to be executed on Linux, Unix, or Mac OS, one can target bash or tcsh. I always reccomend targeting the standard Bourne Shell, since it is guaranteed to exist on POSIX-compatable systems. Unforntunately, a lot of bash-specific documentation exists. So we can go to the source for shell standard: the Single UNIX Specification, The Standard Command Language Interpreter and The Shell Command Language.

Update: here's a list of all the shell utilities POSIX requires to exist:
admin alias ar asa at awk basename batch bc bg break c99 cal cat cd cflow chgrp chmod chown cksum cmp : comm command compress continue cp crontab csplit ctags cut cxref date dd delta df diff dirname dot du echo ed env eval ex exec exit expand export expr false fc fg file find fold fort77 fuser gencat get getconf getopts grep hash head iconv id ipcrm ipcs jobs join kill lex link ln locale localedef logger logname lp ls m4 mailx make man mesg mkdir mkfifo more mv newgrp nice nl nm nohup od paste patch pathchk pax pr printf prs ps pwd qalter qdel qhold qmove qmsg qrerun qrls qselect qsig qstat qsub read readonly renice return rm rmdel rmdir sact sccs sed set sh shift sleep sort split strings strip stty tabs tail talk tee test time times touch tput tr trap true tsort tty type ulimit umask unalias uname uncompress unexpand unget uniq unlink unset uucp uudecode uuencode uustat uux val vi wait wc what who write xargs yacc zcat

Of these utilities, on my Ubuntu 12.04 system:

Shell builtin or keyword (bash):
: alias bg break cd command continue echo eval exec exit export false fc fg getopts hash jobs kill printf pwd read readonly return set shift test time times trap true type ulimit umask unalias unset wait

Located in /bin or /usr/bin
ar at awk basename batch bc c99 cal cat chgrp chmod chown cksum cmp comm cp crontab csplit ctags cut date dd df diff dirname dot du ed env ex expand expr file find fold fuser gencat getconf head iconv id ipcrm ipcs join link ln locale localedef logger logname lp m4 make man mesg mkdir mkfifo more mv newgrp nice nl nm nohup od paste patch pathchk pr ps renice rm rmdir sed sh sleep sort split strings strip stty tabs tail tee touch tput tr tsort tty uname uncompress unexpand uniq unlink vi wc who write xargs zcat

Not found:
admin asa cflow compress cxref delta fort77 get lex mailx pax prs qalter qdel qhold qmove qmsg qrerun qrls qselect qsig qstat qsub rmdel sact sccs talk unget uucp uudecode uuencode uustat uux val what yacc

dash (/bin/sh) has a smaller set of builtins: it lacks fc and time. /usr/bin/time exists, but there is no fc in dash.