Transcript The Korn Shell (ksh) CS465 – Unix
CS465 – Unix The Korn Shell (ksh)
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
command
Can use
((
instead of let
))
:
x=3 y=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
• Bourne Shell
result=`expr calculation` [ $num -ge 0 ] [ $num1 -gt 0 -a $num2 -lt 100 ]
• Korn Shell
(( result = calculation )) (( num >= 0 )) (( num1 > 0 && num2 < 100 ))
let
example
i=1 total=0 while (( i <= 100 )) do (( total = total + i )) (( i = i + 1 )) done echo $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 -L file f1 -ef f2 f1 –nt f2 f1 –ot f2
file exists file exists and is a symbolic link file1 and file2 are linked file1 is newer than file2 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 else ls -l $1 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 r 11
alone repeats the last command.
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.
Some
vi
for Command Line Editing
fc
x dw $
Enter command mode Enter insert mode and add text before/after cursor Move cursor right Move cursor left Move to character
c
Delete character Delete one word Move to end of line Execute the command
Using Filename Completion
• Automated completion of a filename used as an argument to a command.
• To initiate, use the
$ ls file1 file2 fileofstuff notes subdir whynot $ vi n
Uses vi to edit the file
notes
Note: Only works when file completion is
unique
Filename Completion Choices
• If the filename is NOT unique, you can get a list of choices by using:
• Example:
$ cat f
Now when you press a number (1-3), that file is chosen and used to complete the command.
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 $EDITOR
working directory set before current one pathname of editor to use for line editing
$PS3 $TMOUT
prompt for select loops (default is #?) 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
$ cat mul
read 'num1?Enter a number: ' read 'num2?Enter another number: ' (( prod = num1 * num2 )) echo $num1 times $num2 is $prod
$ mul
Enter a number: 5 Enter another number: 8 5 times 8 is 40
$
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 user num=0 until [ num -gt 0 ] do $ echo Enter a positive non-zero number: read num done echo You entered $num exit 0
until Example
Read in a number from a user, and verify the number is positive.
$ cat posnum #! /bin/sh # Read positive number from user num=0 until (( num > 0 )) do $ echo Enter a positive non-zero number: read num done echo You entered $num exit 0
until Example Execution
$ posnum
Enter a positive non-zero number: -50 Enter a positive non-zero number: 0 Enter a positive non-zero number: 12 You entered 12
$
select statement
select
var
do
command(s)
in
list
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 script junk=$HOME/junkdir # # If junkdir directory doesn't exist, create it if [[ ! (-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") esac done exit 0 break;; *) echo Invalid choice; please try again;;
$
NOTE: The
break
command is used to exit the loop.
select execution
$ pwd
/export/home/jmsmith
$ junkdir
1) List junk 2) Delete junk 3) Junk files 4) Exit
#? 1
total 0
#? 3
Enter files to junk: p2.c
#? 1
total 2 1 jwsmith 122 May 7 13:19 p2.c
-rw-------
#? #? 1
total 0
#? 4 $
Other Korn Additions: String Length
• Length of string:
${#varname}
– Returns length of string stored in
variable
• Example:
$ cat namelen
name="Pam Smallwood" echo ${#name}
$ namelen
13
$
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 aliases alias rm='rm -i ' alias rename='mv ' alias c clear # Set environment variables PATH=$PATH:.
PS1="$PWD[!] $ " EDITOR=vi # Export global variables export PATH EDITOR PS1 # Set history variables HISTSIZE=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
Terminal Session Example
$ script session1
Script started, file is session1
$ pwd
/export/home/small000
$ date
Thu May 22 19:34:25 MDT 2003
$
Script done, file is session1
$ cat session1
$ pwd /export/home/small000 $ date Thu May 22 19:34:25 MDT 2003 script done on Thu May 22 19:34:29 2003
$