Why is $ the default symbol for a user shell and # the default symbol for a root shell?

Historically the original /bin/sh Bourne shell would use $ as the normal prompt and # for the root user prompt (and csh would use %). This made it pretty easy to tell if you were running as superuser or not.

# is also the comment character, so anyone blindly re-entering data wouldn't run any real commands.

More modern shells (eg ksh, bash) continue this distinction of $ and # although it's less important when you can set more complicated values such as the username, hostname, directory :-)


Tradition.

The POSIX standard says (my emphasis):

PS1

This variable is used for interactive prompts. Historically, the "superuser" has had a prompt of #. Since privileges are not required to be monolithic, it is difficult to define which privileges should cause the alternate prompt. However, a sufficiently powerful user should be reminded of that power by having an alternate prompt.

See also this answer to virtually the same question on the SuperUser forum.