Shell programming allows users to communicate with and run commands on a UNIX system through shell programs that interpret commands. There are several types of shells including Bourne shell, Bourne Again shell, C shell, and Korn shell. Shell scripts can be written to automate tasks using shell variables, control structures, and built-in commands. System scripts use shell programming for important system processes and services.