sh vs bash : Um resumo
Se você está lendo isso, então há uma boa chance de que você tenha encontrado os termos shell, sh, bash etc no passado. Estes termos podem parecer confusos e como eles estão intimamente relacionados isso torna o problema ainda pior. Então eu decidi escrever este post com o objetivo de tentar explicar as diferenças entre eles.
Shell vs Kernel
Antes de seguir em frente é importante que entendamos o significado dos termos shell e kernel.
Kernel
O kernel é o centro do sistema operacional. Ele é responsável por fazer coisas como interagir com o hardware, fazer I/O de arquivos e gerar processos.
Shell
A shell age como uma interface entre o usuário e o kernel. Tecnicamente falando, um shell é um interpretador de linha de comando, ou seja, o programa que interpreta o comando que você digita no seu emulador de terminal (modo interativo) ou processa scripts shell (arquivos de texto contendo comandos).

Agora temos uma ideia do que é a shell e o kernel, podemos tentar compreender sh e Bash.
sh
Estritamente falando, sh (ou a linguagem de comandos Shell) é uma linguagem de programação descrita pelo padrão POSIX. A chave aqui é que sh não é realmente uma linguagem de programação em si mesma. É apenas uma especificação. Especificação é uma descrição detalhada da sintaxe e semântica dessa linguagem. Especificação não inclui uma implementação.
Bash
Existem sistemas operacionais diferentes com seus próprios shells e kernel. O Bash é o shell para o sistema operacional GNU. Mas também podemos dizer que o bash é uma linguagem de programação.
Espere, isso não é confuso? O bash é tanto uma shell como uma linguagem de programação?
Pense em python. Também podemos iniciar o Python em modo interativo e ele se comporta como uma shell. Ou JavaScript, ou Ruby ou qualquer linguagem de script.

>
Faz sentido?
Bash é uma linguagem de programação que pode ser pensada como uma implementação de sh (embora isso tenha mudado com o tempo).
Para resumir, sh é uma especificação, bash é a implementação.