the korn shell (ksh) cs465 – unix. ksh shell the korn (ksh) shell –scripting syntax is...
Post on 20-Dec-2015
271 views
TRANSCRIPT
The Korn Shell (ksh)
CS465 – Unix
ksh Shell
• The Korn (ksh) shell– Scripting syntax is compatible with the
standard Bourne (sh) shell
– Included in Unix operating systems from most vendors (Sun Solaris, SGI IRIX, Linux, etc.)
– Provides some extra features:• Command aliasing
• Easier user input and math calculations
• Command history
• Command-line editing
Command Aliases
Aliases allow you to define your own commands• Format:
$ alias [-x] name=definition
• Examples:$ alias ll="ls -la"
$ alias dir="ls -F"
$ alias –x home="cd;ls"
$ alias –x rm="rm -i"
Using the –x option “exports” the alias.
Command Aliases
• To remove aliases:$ unalias name
• To show all aliases:$ alias
• If you put the alias commands in your .profile or .kshrc file, you can use them every time you login.
Displaying Alias Values
• To determine which command a specific alias will run, use either alias OR whence:
$ alias ll="ls -la"
$ alias ll
ll='ls –la'
$ whence ll
ls –la
$
The Dash (-) Character• Dash (-) represents the previous working directory. When used to
cd, it automatically displays the current directory path.
• Example: Switching between one of your subdirectories and the system bin directory:
$ pwd/home/user1/sub1$ cd /bin$ pwd/bin$ cd -/home/user1/sub1$ cd -/bin$
The let command
• let provides built-in integer handling that easier to use and 10-30 times faster than expr
• Syntax:$ let math-expression
NOTE: Use = to assign values
• Examples
$ let i=i+1
$ let "prod = 12 * 6" Double quotes allow spaces and no backslash on *
The let commandCan use (( instead of let )):
x=3y=4((z = x * y)) Result: z = 12
((z = z + 1)) Result: z = 13
Notes: - No dollar sign ($) needed to access variable values
- Double parentheses act as quotes, so you can add spaces and don’t need to backslash metacharacters
let Operators– Integer operators:
+, -, *, /, %
– Integer comparisons: <, <=, ==, !=, >=, >
– Compounds
&& (and), || (or), ! (not)
NOTE: No backslashes needed inside (( ))
Bourne vs Korn Comparison
• Korn Shell
• Bourne Shell
[ $num -ge 0 ]
(( num >= 0 ))
[ $num1 -gt 0 -a $num2 -lt 100 ]
(( num1 > 0 && num2 < 100 ))
result=`expr calculation`
(( result = calculation ))
let example
i=1
total=0while (( i <= 100 ))do
(( total = total + i ))(( i = i + 1 ))
doneecho $total
Korn Additional test Operators
• The Korn shell also extends the test expression from the Bourne shell.
• By using two sets of square brackets, instead of one set, the system uses the Korn shell (instead of Bourne) to test specific conditions.
[[ test-condition ]]
Korn Additional test Operators
File Operators:-a file file exists
-L file file exists and is a symbolic link
f1 -ef f2 file1 and file2 are linked
f1 –nt f2 file1 is newer than file2
f1 –ot f2 file1 is older than file2
Logical operators:
&& logical AND
|| logical OR
Korn test example
$ cat lsdir
#! /bin/ksh
# lists directory contents if yours
if [[ -d $1 && -O $1 ]]
then
ls -l $1
else
echo Error - not a directory or not yours!
fi
exit
$
Command History• The Korn shells supports a history feature
that lets you recall previous commands, performing a substitution if necessary.
• The history command displays the previous 16 commands:
$ history
• Common Alias:
$ alias h="history"
r (recall/rerun command)
r alone repeats the last command.
r 11 repeats command number 11
r -2 repeats the command before the last one.
r d repeats the last command that started with a “d”.
r sort one=two repeats previous sort command using two instead one.
History Variables
• HISTFILE contains name of your history file
HISTFILE=$HOME/.myhist• If you do not provide a name, then the Shell uses:
$HOME/.sh_history
• HISTSIZE contains how many commands to save– Default (to save) is 128 (but show only last 16)
HISTSIZE=50
In-Line Command Editing
• You can perform vi in-line editing of the command line
• In-line edit mode enables you to edit a previous command on the current command line
• Use vi commands to move and edit the previous command line
Turning On/Off Editing
$ set [-+]o vi
set -o vi turns command-line editing on
set +o vi turns it off
Once turned on, ESC key activates the in-line editor
To use:
Press the ESC key to activate in-line editing.
Press – (or k) until the desired command appears.
Edit using vi commands, then press ENTER.
Using Command Line Editing
• Your command line now becomes a single line editor window into the command history file.
• The single line you start viewing is the current Shell command line.
• You can move to other lines by using the editor move commands (- moves backwards, + moves forwards).
• Editor search commands can also be used to select the line being viewed.
<ESC> Enter command mode
i/a Enter insert mode and add text before/after cursor
l Move cursor right
h Move cursor left
fc Move to character c
x Delete character
dw Delete one word
$ Move to end of line
<Enter> Execute the command
Some vi for Command Line Editing
Using Filename Completion
• Automated completion of a filename used as an argument to a command.
• To initiate, use the <ESC> key and a backslash
• Example:$ lsfile1 file2 fileofstuffnotes subdir whynot$ vi n<ESC>\
Uses vi to edit the file notes
Note: Only works when file completion is unique
• If the filename is NOT unique, you can get a list of choices by using: <ESC>=
• Example:$ cat f<ESC>=1) file12) file23) fileofstuff$ cat f_
Now when you press a number (1-3), that file is chosen and used to complete the command.
Filename Completion Choices
Additional Korn Shell Variables
$PPID the shell's parent process' PID
$_ last parameter of previous command
$RANDOM randomly generated integer (0-Max)
$ENV pathname of Korn shell environment startup file
$OLDPWD working directory set before current one
$EDITOR pathname of editor to use for line editing
$PS3 prompt for select loops (default is #?)
$TMOUT number of seconds to wait before exiting shell if no command is given
OLDPWD example
$ pwd
/home/smith123/cprogs
$ cd /etc
$ pwd
/etc
$ cd $OLDPWD
$ pwd
/home/smith123/cprogs
New Pattern Matching
~ home directory(equivalent to $HOME)
~username username’s home
~+ current working directory(equivalent to $PWD)
~- previous working directory(equivalent to
$OLDPWD)
Using Tilde Substitution$ pwd
/home/smith123/progs/cprogs
$ cd
$ pwd
/home/smith123
$ cd ~-
$ pwd
/home/smith123/progs/cprogs
$ cd ~jones456
$ pwd
/home/jones456
Reading User Input
• Korn shell provides one command that will BOTH “echo” and “read”:
• Syntax:
$ read 'varname?prompt'
• Examples:
$ read 'name?Enter your name: '
$ read 'year?Current year? '
read Example
$ mulEnter a number: 5Enter another number: 85 times 8 is 40$
$ cat mulread 'num1?Enter a number: 'read 'num2?Enter another number: '(( prod = num1 * num2 ))echo $num1 times $num2 is $prod$
until statement
until [ condition ]do
command(s)
done
• Same condition syntax as if statement
• Begin and end of command block defined by keywords do…done
• Loops UNTIL condition is TRUE
until Example
Read in a number from a user, and verify the number is positive.
$ cat posnum#! /bin/sh# Read positive number from usernum=0until [ num -gt 0 ]doecho Enter a positive non-zero number:read num
doneecho You entered $numexit 0$
until Example
Read in a number from a user, and verify the number is positive.
$ cat posnum#! /bin/sh# Read positive number from usernum=0until (( num > 0 ))doecho Enter a positive non-zero number:read num
doneecho You entered $numexit 0$
until Example Execution
$ posnumEnter a positive non-zero number:-50Enter a positive non-zero number:0Enter a positive non-zero number:12You entered 12$
select statement
select var in listdo
command(s)
done
• Implements a menu from within a loop. Automatically displays a numbered list of choices, and interpret the number that the user enters.
• Begin and end of command block defined by keywords do…done
select statement
• You must still use the case control structure to evaluate the choice chosen, but the structure will loop automatically unless you have chosen to exit.
• If your menu options consist of multiple words, they must be enclosed in double quotes.
select example$ cat junkit#!/bin/ksh# Menu-driven junkit scriptjunk=$HOME/junkdir## If junkdir directory doesn't exist, create itif [[ ! (-d $junk) ]]then 'mkdir' $junk
fi#select choice in "List junk" "Delete junk" "Junk files" "Exit"
do case $choice in "List junk")
ls -lgF $junk;;
select example
"Delete junk") rm $junk/*;;
"Junk files") read 'filelist?Enter files to junk: ' mv $filelist $junk;;
"Exit") break;;
*) echo Invalid choice; please try again;; esacdoneexit 0$
NOTE: The break command is used to exit the loop.
select execution
#? 3Enter files to junk: p2.c#?
$ pwd/export/home/jmsmith$ junkdir1) List junk2) Delete junk3) Junk files4) Exit#? 1total 0#?
#? 1total 2-rw------- 1 jwsmith 122 May 7 13:19 p2.c#? #? 2#? 1total 0#? 4$
Other Korn Additions:String Length
• Length of string: ${#varname}– Returns length of string stored in variable
• Example:$ cat namelenname="Pam Smallwood"echo ${#name}$ namelen13$
Other Korn Additions
• Forcing Command Execution– In addition to the back quotes (graves)`command`
– In Korn you can use: $(command)
• Example:$ name=$(whoami)
$ echo $name
small000
$
Sample .kshrc file
# Set command aliasesalias rm='rm -i 'alias rename='mv 'alias c clear# Set environment variablesPATH=$PATH:.PS1="$PWD[!] $ " EDITOR=vi# Export global variablesexport PATH EDITOR PS1# Set history variablesHISTSIZE=40
Default .profile
• Review handout
Capturing a Terminal Session
• You can capture what your terminal display to a file using the command script
• Syntax: $ script filename
• Everything that appears on your screen will be captured in the file, until you enter <ctrl-d>
Terminal Session Example
$ script session1Script started, file is session1$
$ cat session1$ pwd/export/home/small000$ dateThu May 22 19:34:25 MDT 2003script done on Thu May 22 19:34:29 2003$
pwd/export/home/small000$ dateThu May 22 19:34:25 MDT 2003$ <CTRL-d>Script done, file is session1$