A resposta curta é não, eles não são 100% compatíveis.
Mas a maioria dos shells é bem próxima do básico, então você raramente iria se deparar com inconsistências. Na verdade, a maioria das shells não diferem muito pela sintaxe adicionada, mas por alguns recursos extras, como conclusão de tabulação e similares.
Além disso, dash é uma espécie de descendente de ash - ou porta do BSD para o Linux, para ser preciso. E todos eles devem ser descendentes ou implementações diferentes de sh . De fato, sh está na maioria dos sistemas apenas um symlink para bash , dash ou outra coisa. O que importa é a conformidade POSIX - e quando você escreve scripts de acordo com os padrões, você não terá problemas.
A diferença entre essas camadas está nas otimizações e no desempenho. Eles são menos ricos em recursos que bash , mas são totalmente legítimos. O Bash é rico em recursos para trabalhos interativos, mas usa mais memória, por exemplo.