sh c'est le seul shell POSIX que t'es sûr d'avoir sur à peu près tous les Unix. Sous GNU/Linux on a souvent bash par défaut, mais sous FreeBSD c'est csh/tcsh, sous OpenBSD c'est ksh. Mais dans tous les cas on a sh, et il se comporte à peu près de la même façon.
Ça veut pas dire qu'un script sh qui marche sur ton système marchera avec d'autres implémentations de sh, y'a des parcitularités qui ne sont pas adressées par le standard POSIX et par conséquent ça créé des différences, notamment dans la gestion de la « scope » pour les variables. Et bien sûr si tu veux une bonne portabilité, il faut te limiter à utiliser des commandes POSIX, et ne pas utiliser les extensions fournies par ton système à ces utilitaires (et GNU ajoute pas mal d'extensions, en particulier les options longues que tu peux oublier si tu veux porter tes scripts sous BSD).
http://pubs.opengroup.org/onlinepubs/009696699/utilities/contents.html
Et en vrai il ne faut même pas assumer que toutes ces commandes seront présentes, typiquement sous Debian GNU/Linux j'ai pas (par défaut) les commandes bc et talk (et j'ai pas tout testé).