The shell is the program that runs in the terminal, that reads the commands you type and executes them.
Unix and Unix-like operating systems today offer a choice between mostly the same set of shells, because these shells pre-date most of those operating systems.
For further reading I recommend Evolution of shells in Linux (IBM)
Edit to add information regarding shells and terminals following comments on another answer:
A terminal is a hardware peripheral that interfaces with a human, it is composed of output to the user and input from the user, in other words of a screen and a keyboard, see link. What the GUI shows you is a virtual terminal. The shell is the command-line interface software that is usually what you see on a terminal, but it doesn't have to be a shell. You could start up a virtual terminal and tell it to run vi directly, for example, no shell involved.