The Korn shell was developed by David Korn from AT&T Bell Lab
Like bash, the Korn shell is based on the older Bourne shell and therefore the Korn shell is similar to bash
In this note, we discuss the many similarities and few differences between the Korn and bash shells
Running the Korn Shell
The Korn shell can be the default login shell, just like bash is our default login shell on voyager
The default Korn shell prompt (stored in PS1) is: $
From any shell, to start the Korn shell: ksh
To check where the Korn shell is in the system: whereis ksh
Normally the Korn shell is at: /bin/ksh
If the Korn shell is started as a child process of another shell, to get back to the original shell, use: exit
To find the current shell that is running: echo $0
If the command line editing is not set for ksh as it is for bash, here are some general tips to re-run previous commands with ksh:
history will show the last commands that are run, along with their number in the history file
r re-run the last command
r number re-run the command with the matching number in the history file
Input / Output
As in bash, use read for reading in user input
To print to screen, we can use echo as with bash, but most Korn shell scripts use print
For example: print current value is $var
Just like with any other shell, the Korn shell script also accepts command line arguments and options
Command line arguments are accessed through the positional parameters and getopts is also available with ksh
We can also use redirection of both input and output of the shell
We can also use command substitutions and pipes for input and output
Variables and Expressions
User defined variables are created, initialized, unset, and accessed the same way as in bash
Likewise, system variables such as PATH, PS1, HOME, etc. are the same as in bash
Shell variables (such as $0, $1, $2, $*, $@, $?) are the same
Arrays are defined and accessed the same way as in bash
Strings and arrays can be manipulated with the same operators, such as ${#array[@]} or ${str/expr/newStr}, and by the same built-in functions such as shift and set
Regular expressions can be used for string matching by the shell with the operator =~, just as with bash
However, the regex metacharacters are limited to:
Anchors: ^ $
Single character: .
Most of the time, regex in ksh are used in conjunction with egrep, sed, or awk
There is a special set of regex that are used with the string operators
They are similar to regex used by bash and other utilities, but are in different format
Korn : bash:
*(expr) expr*
+(expr) expr+
?(expr) expr?
@(expr1 | expr2) expr1 | expr2
{n,m}(expr) expr{n,m}
For example, using regex with string substitution:
str="cis33a cis33b"
print ${str/+(3)/4} print: cis4a cis33b
Or
classes=(cis33a cis33b cis18a cis18b cis18c)
print ${classes[@]/*([a-z])/} print: 33a 33b 18a 18b 18c
Evaluating Expressions
Logical operators: !, &&, || are the same
String relational operators: =, !=, <, > are the same
Numeric relational operators: -ne, -eq, -lt, -gt, -ge, -le are the same
As in bash, to evaluate logical and relational expression, use [[ ]]
Arithmetic operators are the same: +, /, *=, ++ …
Evaluate arithmetic expression the same way: (( expression ))
where the variable names do not need a preceding $
As with bash, arithmetic compares can be written as (( expression )) where the compare operators are < , >=, == …
File tests are the same way, except for the file exist test
-a or -e file exists -s exists and is not empty
-d file is a directory -nt file1 is newer than file2
-f file is a regular file -ot file1 is older than file2
-h file is a link
-r have read permission
-w have write permission
-x have execute permission
Flow Control
The if and case statements have the same syntax as in bash
The for, while, until loops have the same syntax as in bash
Functions can be defined the same way as in bash
Functions can also be defined this way:
function fA # start with keyword function, no ( )
{
…
}
The return or exit statement works as in bash
As in bash, to check for return or exit status, use: $?
As in bash, variables are global by default
To make a variable local, use: typeset varName
Signals
Signals and signal handling are the same way as in bash
The trap command is used to catch signals
The difference from bash is when signal handling are reset to default:
trap - signalName