The fragmentation of the UNIX marketplace has had its advantages and disadvantages. The advantages came mostly in the early days: lack of standardization and proliferation among technically savvy academics and professionals contributed to a healthy "free market" for UNIX software, in which several programs of the same type (e.g., shells, text editors, system administration tools) would often compete for popularity. The best programs would usually become the most widespread, while inferior software tended to fade away.
But often there was no single "best" program in a given category, so several would prevail. This led to the current situation, where multiplicity of similar software has led to confusion, lack of compatibility, and-most unfortunate of all-UNIX' inability to capture as big a share of the market as other operating platforms (MS-DOS, Microsoft Windows, Novell NetWare, etc.).
The "shell" category has probably suffered in this way more than any other type of software. As we said in the Preface and Chapter 1, Korn Shell Basics, of this book, several shells are currently available; the differences between them are often not all that great. We believe that the Korn shell is the best of the most widely used shells, but other shells certainly have their staunch adherents, so they aren't likely to fade into obscurity for a while.
Therefore we felt it necessary to include information on shells similar to the 1988 UNIX Korn shell. This Appendix summarizes the differences between the latter and the following:
We'll conclude this appendix with a look at the Korn shell's future: the next release's expected features, obsolescent features of the current shell, and other issues.
The Korn shell is almost completely backward-compatible with the Bourne shell. The only significant feature of the latter that the Korn shell doesn't support is ^ (caret) as a synonym for the pipe (|) character.  This is an archaic feature that the Bourne shell includes for its own backward compatibility with earlier shells. No modern UNIX version has any shell code that uses ^ as a pipe.
 There are also a few differences in how the two shells react to certain extremely pathological input. Usually, the Korn shell processes correctly what causes the Bourne shell to "choke."
To describe the differences between the Bourne shell and the Korn shell, we'll go through each chapter of this book and enumerate the features discussed in the chapter that the Bourne shell does not support. Although some versions of the Bourne shell exist that include a few Korn shell features,  we refer to the standard, Version 7 Bourne shell that has been around for many years.
All. (I.e., the Bourne shell doesn't support any of the history and editing features discussed in Chapter 2.)
Aliases; set -o options. The Bourne shell supports the "abbreviations" listed in the "Options" table in Appendix B, Reference Lists-except -A, -h, -m, -p, and -s. Environment files aren't supported; neither is the print command (use echo instead). The following built-in variables aren't supported:
Functions; the whence command; pattern-matching variable operators (%, %%, #, ##); advanced (regular expression) wildcards-use the external command expr instead.
Command substitution syntax is different: use the older
instead of $(command).
Conditional tests use older syntax: [condition] or test condition instead of [[condition]]. These are actually two forms of the same external command (see the test(1) manual page). The logical operators && and || are -a and -o instead. Supported test operators differ from system to system. The select construct isn't supported.
Use the external command getopt instead of getopts, but note that it doesn't really do the same thing. Integer arithmetic isn't supported: use the external command expr instead of the $((arithmetic-exp)) syntax. For integer conditionals, use the old condition test syntax and relational operators -lt, -eq, etc., instead of ((arithmetic-expr)). let isn't supported. Array variables and the typeset command are not supported.
print isn't supported (use echo instead). None of the options to read are supported.
Job control-specifically, the jobs, fg, and bg commands. Job number notation with %, i.e., the kill and wait commands only accept process IDs. The - option to trap (reset trap to the default for that signal). trap only accepts signal numbers, not logical names. Coroutines aren't supported.