Hey Linuxkid,
There are many different types of shell implementations, ranging from ksh, to csh, to bash. Most coding these days, I'm told, is done on bash (you'll get more information if you wiki around).
If you run `sh test.sh', then the shell that runs test.sh is the shell that is invoked when sh is called. To find out which shell `sh' invokes, see what it directs to. Your `sh' command will probably sit in `/bin'. If you do `ls -al /bin/sh' (`ls -al' shows all files in the long listing format - see `man ls' for more), you will find that /bin/sh is probably a symlink (you will probably see an arrow like this `/bin/sh -> dash'). For more on symlinks, do `man ln'. A simple description is that symlinks are like shortcuts in Windows. They point to the *actual* command you invoke when you run sh.
Getting back to `sh', the word that follows the arrow, is the command or shell that is actually invoked when you run sh. Thus, for me, when I do `sh test.sh', what happens is that test.sh is run as a script in the *dash* shell.
Now, if test.sh starts with the line `#!/bin/bash', then that is a direction that it should be run using the *bash* shell only! However, this constraint is obeyed only when you run ./test.sh. That is, even if you have `#!/bin/bash', and you run `sh test.sh', test.sh will run in dash (or whatever your `sh' points) regardless of your `#!..' statement (this is sometimes called a shebang or hashbang. See
Shebang (Unix) - Wikipedia, the free encyclopedia). The shebang is followed only if you do `chmod +x test.sh' and then run `./test.sh'.
I hope this helps?