/bin/sh ist die Bourne Shell. Sie stammt von AT&T und ist Closed Source. Daher wirst du sie auch nicht bei deiner Linux Distribution finden.
/bin/bash ist die Bourne Again Shell, die freie Variante der Bourne Shell. Die Bash ist 100% sh-kompatibel.
die /bin/bash eigentlich die gebräuchlichste Shell.
Fast alle Skripte werden für sie geschrieben.
Die einzige Shell, die die bash übertrifft, ist die ZSH.
Unterschiede sind z.B., dass die ZSH auch Tippfehler korrigieren kann (muss extra eingeschaltet werden), standardmäßig bei TAB-Vervollständigung die Vorschläge anzeigt (bei der Bash muss man normalerweise 2xTAB drücken, lässt sich aber konfigurieren), die ZSH Completion für Programme wir apt-get liefert und bei rpm -i TAB z.B. nur noch die Dateien mit der Endung .rpm anzeigt.
Die sh ist quasi der Vorgänger der Bash (andersrum ist es korrekter: die Bash ist der Nachfolger der sh, quasi ein verbesserter Klon).
Die sh ist älter als die Bash und ist nicht ganz so mächtig, hat also weniger "Optionen". Da aber früher unter Unix so ziemlich alles mit dieser Shell gemacht wurd, wird sie auch heute noch benutzt und ist sozusagen der kleinste gemeinsame Nenner. Schreibst du unter Linux ein Shellscript für die /bin/sh, so läuft dieses auch unter Solaris oder beispielsweise FreeBSD, denn auch diese haben eine /bin/sh mit genau der selben Syntax. Die Bash hingegen findest du auf solchen Systemen vielleicht nicht, daher schreibt man Scripte auf meist für /bin/sh.
Es gibt noch einen weiteren Grund, warum man für /bin/sh schreiben sollte, der allerdings auf Linux leider NICHT zutrifft (was ich wirklich dumm finde). Unter FBSD ist /bin/sh beispielsweise ein eigenständiges Programm, also nicht wie bei Linux einfach ein zweiter Name für die Bash. Das hat zwei Vorteile:
1) /bin/sh (die eigenständige Shell) startet erheblich schneller als die Bash im sh-Modus. Beim Booten werden gleich ein paar Dutzend Shells gestartet, so daß das eine große Zeitersparnis bringt.
2) Die sh enthält eben wirklich nur die Features der sh, nicht mehr. Die bash hingegen hat die Features der sh und der bash. Das wirkt sich nicht nur auf die Performance aus, sondern auch auf den RAM-Verbrauch. Der kann schonmal 1MB höher bei Linux ausfallen, als bei FBSD mit einer eigenständigen /bin/sh. Das klingt nicht viel, aber wenn auf einem System 20 Scripte laufen, sind das schon 20MB (vor allen Dingen unnötige MB!).