This question is getting a little stale, but I thought I might clear up the distinction between terminal and shell as requested in the second part of the question. You can think of the terminal as a display device. These days, it is most typically a program, but there was a time when the terminal was a separate box. When you start the terminal program, it will send a wakeup signal to the local system. In the old days, the physical terminal sent a electrical signal on the (typically RS232) connection to the terminal interface. In either case, the operating system sends a "login" text back to whatever device or program sent the wakeup signal. The shell is not involved yet.
The operating system completes the login by verifying the user name and password (if any). Then it checks the verified user's entry in the password file for the name of that user's preferred shell. There is a default shell assigned when the account is created, and the user can generally change that assignment later. The OS starts the shell program, and the shell inherits the communications path connected to the terminal. The terminal program is still there, displaying the text sent to it and sending what the user types back up the communications line. Now it is the shell on the other end of the line, not the OS.
Any program can be assigned as the users initail login shell. It would be possible, but not very useful, to assign the 'date' program as the login shell. In that case, after login the user would just see the date displayed in his terminal window, and would be logged off. The difference between the terminal and the shell is that the terminal is always there, listening and talking with the user. It does not interpret the keystrokes (beyond mapping to a character set). The shell is what the OS starts up (or the user later adds in stack-like fashion) to handle communications on the other end of the terminal communications line. It decides on an action to take in response to a user's keystrokes.