.sh é indicativo de um script para o shell Bourne ( sh ) ou o shell Bourne Again ( bash ), que geralmente é um superconjunto de seu predecessor.
.csh é indicativo de um script para o shell C ( csh ), que, sendo um shell, é muito semelhante, mas significativamente diferente assim que você começa a fazer algo muito mais complexo do que executar uma série de static comandos.
Ambos os shells estão geralmente disponíveis em qualquer ambiente POSIXy, e na verdade ambos são pré-instalados, embora bash (e seu primo sh ) sejam um pouco mais onipresentes na minha experiência.
Eu digo 'indicativo' acima, porque a ideia de uma extensão de arquivo não existe tecnicamente e não tem significado semântico ou sintático. Um arquivo pode ser denominado script.steve ou documentation.exe ou include.h e ainda ser, na verdade, um script de shell. Para uma confirmação mais definitiva, veja a primeira linha do arquivo. Para um script projetado para ser executado diretamente, ele deve começar com uma linha shebang, que começa com um octothorpe ( # ), um estrondo ( ! ) e o caminho para o executável que deve executar o script. Por exemplo:
#!/usr/local/bin/bash
ou
#!/usr/bin/python3