Eu assumo que a razão pela qual você quer fazer isso é por portabilidade. As respostas acima dão uma pista. Se você assumir que o shell Bourne (sh) é o mínimo denominador comum e disponível em qualquer lugar (Linux, Solaris, Unix, AIX, etc.), então você pode colocar um #!/bin/sh
no início do seu script e escrever todo o seu script usando apenas os recursos do sh.
(Eu acho que no Linux, sh é apenas um alias para o bash, porque o bash é um superconjunto do shell Bourne, mas não importa, ele ainda deve funcionar.)
Um pequeno refinamento é assumir que sh
está sempre lá, mas você pode precisar do poder extra e da conveniência de alguns dos shells mais avançados.
então você poderia escrever uma versão do script para cada um dos shells que você suporta, por exemplo script.bash, script.zsh, script.ksh, script.csh etc. cada um começando com sua própria linha shebang e, em seguida, no arquivo script.sh, você diria algo como:
#!/bin/sh
if [[ -e /bin/ksh ]] ; then
./script.ksh
exit
elif [[ -e /bin/csh ]] ; then
./script.csh
exit
fi
etc.
Outra sugestão é estudar o código-fonte da cadeia de ferramentas de ferramentas automáticas. Aquelas coisas que correm quando você faz um ./configure; faço ; faça a instalação.
O pessoal do GNU tem feito muitas coisas inteligentes para garantir que seus scripts sejam executados em todos os ambientes.