The Korn Shell (ksh) CS465 – Unix

Download Report

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

i/a l h

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 key and a backslash • Example:

$ 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= 1) file1 2) file2 3) fileofstuff $ 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

$