4268
Comment: add example for patternmatching
|
4299
use print since this is the korn shell
|
Deletions are marked like this. | Additions are marked like this. |
Line 15: | Line 15: |
echo $i | print $i |
Line 33: | Line 33: |
http://*) echo a browser can handle that;; *) echo maybe a browser can handle that, too;; |
http://*) print a browser can handle that;; *) print maybe a browser can handle that, too;; |
Line 37: | Line 37: |
$ [[ ${pathname} == /* ]] && echo path is absolute; | if [[ ${pathname} == /* ]]; then print path is absolute; fi |
Korn Shell
The KornShell is a reimplementation of the BourneShell. It is downward compatible, but adds many features intented to simplify programming. Most of the features are part of PosixShell, too, and therefore are available on any PosixSystem.
The BashShell also implements most of the functionality.
The KornShell is part of any modern (commercial) Unix system, e.g. ["Solaris"], ["AIX"], ["HP-UX"]. An OpenSource version called PdKsh ("Public Domain Korn Shell") is available e.g. for ["Linux"].
The successor to the KornShell is KornShell93, which adds even more features. The source for KornShell93 was recently liberated, and some GNU/Linux distributions now offer it in addition to (or instead of) PdKsh.
KornShellArrays provide arrays with numerical indexes
TypedVariables using the [wiki:TypedefCommand typedef] command. It can be used to print strings left- or right-aligned, print integer numbers with leading zeros, or provide LocalVariables for a function
ArithmeticExpressions in ((...)),
for ((i=0; i<10; ++i)); do print $i done
CommandSubstitution with $(_command_), which simplifies nesting. Compare e.g. the BourneShell command
parent=`basename \`dirname "${PWD}"`
with its KornShell counterpart:
parent=$(basename $(dirname "${PWD}"))
Powerful PatternMatching (for filename generation and for usage in case and [[ ... ]], e.g.:
case ${url} in http://*) print a browser can handle that;; *) print maybe a browser can handle that, too;; esac if [[ ${pathname} == /* ]]; then print path is absolute; fi
ParameterSubstitution like ${var%pattern}, ${var%%pattern} to remove (last/largest) pattern from the end of variable var, and ${var#pattern}, ${var##pattern} to remove (first/largest) pattern from the front of the variable.
[wiki:CoProcess Co-processes], e.g. bc |& to start the "bc" command as a co-process. "read -p" and "print -p" are used to read from or write to the co-process. Other shells (e.g. ["BASH"]) require the user to use e.g. NamedPipes (FiFos) for that purpose
built-in print command. This doesn't sound like a big innovation, but it allows for reliably printing arbitrary characters. Most important uses are "print -n --" to print without trailing NewLine character, and "print -r --" to print arbitrary strings, possibly including EscapeSequences or a BackSlash character.
[wiki:SelectComand select] command for easy menus. select is used like for, but prints an simple interactive menu where a user can select one out of several choices.
KornShellFunctions are similar to traditional BourneShell functions, but can have local variables, local argument handling using [wiki:GetoptsCommand getopts], and local [wiki:TrapCommand traps]
Built-in [wiki:TestOperator [[] ("test") with improved quoting behaviour and more conditional operators than the OldTestOperator
CommandLineEditing with [wiki:ViEditor vi] or [wiki:EmacsEditor emacs] command sequences
Other, smaller improvements over the BourneShell include
Earlier versions of the Bourne shell don't know yet signal names for the [wiki:TrapCommand trap] command, e.g. trap 'rm temp' EXIT instead of trap 'rm temp' 0
TildeSubstitution, ~ is replaced with the user's HomeDirectory, ~_user_ is replaced with the HomeDirectory of the user _user_, e.g. echo ~root
Most of the features of the KornShell are available in the BashShell, too. The following features are not found in the BashShell:
co-processes (process |&)
- built-in "print" command
some of the [wiki:TypedefCommand typedef] options
And everyone's favorite KornShell feature that's not in Bash:
- The last command in a pipe is executed in the current shell instead of a subshell. So the following works the way a naive user would expect:
i=0 ls -l | while read; do ((++i)) done echo "$i lines"