One of the powerful things about Unix is the extensive use of programmable shells, that is, programs (that are not part of the operating system kernel) that allow you to run programs and see their output. This wasn't a new innovation with Unix; the notion of having a replaceable "command shell" rather than a "monitor" tightly integrated with the OS kernel tends to be attributed to Multics.
In any case, the notion of having a powerful, programmable "shell" to allow you to control your environment has led to a proliferation of increasingly powerful shells.
The traditional Unix shell from the very early days. Unix folk need to have some knowledge of sh, as its syntax is what is used in system initialization routines, whether of the BSD or SYSV styles.
Virtually any of the newer shells add, to it, such functionality as:
Command/filename completion (e.g. - spell part of the command name, hit a "hot key," and the shell will try to complete the name of the command/file;
History manipulation; some ability to re-run previous commands;
Command line editor (so you can edit and re-invoke previously run commands);
Definition schemes for aliases/functions to allow you to create custom behaviours.
The FSF folks created an exceedingly souped-up version of the Bourne shell with automated command completion and plenty of additional functionality. Linux systems typically choose Bash as the "basic" shell used by default and for managing init .
Linux Shell Scripting with Bash
This is a pretty comprehensive book that guides the reader on how to use Bash for a wide variety of purposes.
It is very well-motivated; each chapter introduces the area it examines with an interesting anecdote, and presents a reasonably rich set of examples of how to use Bash along with other Unix tools to solve the problem at hand.
It is not solely about Bash; it shows the use of process control tools like ps, kill, and such, text manipulation tools like grep , sort, cut, sed, and such, and version control using CVS . This is all well and proper: One of the major uses of shell scripting is to paste together other programs, and these examples support that.
It is not focused on how to do unusual and abstruse things with Bash; if you're looking for "edge cases," you are probably better off looking through the INFO pages or even the source code. If your needs aren't that abstruse, then even relatively advanced script programmers should be able to learn a few things from the book...
Advanced Bash-Scripting HOWTO - A guide to shell scripting, using Bash
Extended version of the C Shell that adds such functionality as command completion, a command line editor, enhanced history manipulation. The "t" is for Tenex; this shell was initially deployed on the Tenex operating system.
CSH Programming Considered Harmful
CSH is a fairly nice interactive shell that has syntax that looks a lot more like C than that of the Bourne Shell. Traditionally, it was considerably superior for interactive use than sh, and back in my university days, preferred the "Tenex-extended" version called tcsh. Unfortunately, it has some very serious blemishes that make its use for writing substantial shell scripts inadvisable.
Ksh is now nearly universally available, is much cleaner for programming shell scripts, and is thus generally preferable.
This shell, written by David Korn, of Bell Labs, is now the defacto-standard shell for Unix systems, available on virtually any Unix-like system sold in the 1990's and beyond.
It's a reasonable platform for both interactive system control as well as shell script programming, providing far superior functionality to the Bourne Shell. In many cases, it is quite a bit faster, too.
zsh is a really powerful shell that provides fairly much the functionality of ksh, csh, and bash thrown together.
One area in which it is dramatically powerful is in its ability to interactively evaluate and modify arguments. It can do command name completion, filename completion, and is extensible such that it can use programs to evaluate possible command completions.
For instance, I use the MH mail system. zsh can do folder name completion for MH commands, so that I might type:
% refile +Linux/Ad
and press TAB zsh would execute MH code to look up the list of folders under Linux, and, since the only one matching what had been typed was Linux/Advocacy , zsh would complete the parameter thus:
% refile +Linux/Advocacy/
As a result, I seldom need to fully spell out anything; I need only spell enough, and then press TAB and let zsh spell it out for me.
Similar to the Bourne shell, but with a much more powerful set of programming features, and with an actual formal language definition, rc was created for the Plan 9 operating system.
Such as Perl, Tcl, Python, Ruby, REXX...
These languages often allow linking in system libraries and offer more sophisticated data structures (e.g. - structured records, arrays, "objects", and such) which make them reasonable language candidates for implementing entire applications.
"Scripting" languages were traditionally used to control the execution of the "real" programs written in "real programming languages;" it is no longer obvious that the distinction between "scripting" and "real" languages continues to be of terribly much importance.
Turns Unix Shell scripts into a compiled form (probably using C) such that the internal contents are not revealed. Running strings won't tell you what it does...
A command shell implemented entirely in Elisp that runs in an Emacs buffer.
Two primary reasons to get excited about this are if:
You run Emacs everywhere, making EShell more portable than its alternatives;
You have a great deal of ELisp functions that you would like to be able to use in scripts.
A trivial Unix shell. No globbing; no internal commands; it just takes in lines that consist of single commands with arguments separated by blanks or tabs. Source code consists of one file with about 6K of C code.
A modular Perl shell written, configured, and operated entirely in Perl. It aspires to be a fully operational login shell with all the features one normally expects. But it also gives direct access to Perl objects and data structures from the command line, and allows you to run Perl code within the scope of your command line. And it's named after one of the greatest characters on Futurama, so it must be good!