rm !(*.sh) é uma sintaxe extglob , o que significa remover todos os arquivos, exceto os que têm a extensão .sh .
Na sua instância interativa bash , a opção extglob do shell está ativada:
$ shopt extglob
extglob on
Agora que seu script está sendo executado em um subshell, é necessário ativar extglob adicionando isso no início do script:
shopt -s extglob
Assim, seu script parece:
#!/bin/bash
shopt -s extglob
rm -rf -- !(*.sh)
EDITAR:
Para remover todos os arquivos, exceto .sh extension, use GLOBIGNORE (como você não deseja habilitar extglob ):
#!/bin/bash
GLOBIGNORE='*.sh'
rm -rf *
Exemplo:
$ ls -1
barbar
bar.sh
egg
foo.sh
spam
$ GLOBIGNORE='*.sh'
$ rm *
$ ls -1
bar.sh
foo.sh