LINUX System (English
Download
Report
Transcript LINUX System (English
LINUX System : Lecture 6
Shell Programming
Extension of Functionality
UNIX is designed so that users can extend
the functionality
To build new tools easily and efficiently
To customize the shell and user interface.
To string together a series of Unix commands to
create new functionality.
To create custom commands that do exactly what
we want.
Shell
Command Interpreter that turns text that you
type (at the command line) in to actions
User Interface: take the command from user
Shell Programming
We often want to do a number of commands together
And bundle them up into one new command.
Just like a batch file in MS-DOS
Shell scripts
Any collection of shell commands can be stored in
a file called a shell script. Scripts have variables
and flow control statements like other programming
languages.
Popular Shells
sh
ksh
bash
csh,tcsh
Bourne Shell
Korn Shell
Bourne-Again Shell
C Shell (for this course)
Shell scripts among those shells are
slightly different
shell script
Creating a simple shell script
A shell script is a file that contains commands that the shell
can execute.
Run a shell script
Any commands you enter in response to a shell prompt.
A utility
A compiled program
Another shell script
Control flow commands
Enter the script filename on the command line
The shell interprets and execute the commands one after
another
Why shell script?
Simply and quickly initiate a complex series of tasks or a
repetitive procedure.
Shell script example
#!/bin/csh
echo “Current Time - `date`”
echo I am `whoami`
C Shell
Invoking scripts
There are two ways to launch scripts:
1) Direct interpretation
csh scriptfile [args …]
2) Indirect interpretation
The first line of the file must be
#!/bin/csh
and the file must be executable (permission).
C Shell
Shell Variables
Environment Variables
(Global) environment variable
Used to provide information to programs
New programs and shells inherit environment
variables from their parent shell
(Local) shell variable
Used only by that shell
Not passed to other processes
Environment Variables
“env” or “printenv” command
Display current environment variables
DISPLAY The graphical display to use, e.g. nyssa:0.0
EDITOR The path to your default editor, e.g. /usr/bin/vi
GROUP Your login group, e.g. staff
HOME Path to your home directory, e.g. /home/frank
HOST The hostname of your system, e.g. nyssa
IFS Internal field separators, usually any white space (defaults to tab, space and
<newline>)
LOGNAME The name you login with, e.g. frank
PATH Paths to be searched for commands, e.g. /usr/bin:/usr/ucb:/usr/local/bin
PS1 The primary prompt string, Bourne shell only (defaults to $)
PS2 The secondary prompt string, Bourne shell only (defaults to >)
SHELL The login shell you're using, e.g. /usr/bin/csh
TERM Your terminal type, e.g. xterm
USER Your username, e.g. frank
Set Shell Variables
Mostly set automatically when log in
setenv
$ setenv NAME value
# in C Shell
set
$ set name = value # in C Shell
Variables
To set variables:
set X [= value] # processed as a string
To unset variables : unset X
Variable contents are accessed using ‘$’:
echo $PATH
C Shell
Array
To create lists:
set Y = (abc 1 123)
To set a list element:
set Y[2] = 3
To view a list element:
echo $Y[2]
To count the number of variable elements:
echo $#Y
set fname = prog1
rm ${fname}.c
C Shell
Built-in Variables
$user -- who am I?
$path -- my execution path (list of directories to be searched for
executables)
$term -- what kind of terminal I am using
$status -- a numeric variable, usually used to retun error codes
$prompt -- what I am currently using for a prompt
$shell -- which shell am I using (usu. either /bin/csh or /bin/sh)
% set
Will display the variable lists.
Arithmetic (@) command
C shell provides arithmetic operaters
must be used with the arithmetic (@) command
Arithmetic command works only with integers.
set count = 5
@ count += 2
echo $count
90
Shell Arithmetic
expr op1 math-operator op2
Example
% expr 1 + 3
% expr 10 \* 3
% set A = `expr 3 + $B`
Command arguments
A shell script to swap files:
#! /bin/csh –f
set tmp = $argv[1]
cp $argv[2] $argv[1]
cp $tmp $argv[2]
Arguments : $argv
The number of arguments to a script: $#argv
-f option says we want fast startup (no read .cshrc) .
C Shell
if-then-else
if ( expr ) simple-command
if ( expr ) then
commandlist-1
[else
commandlist-2]
endif
C Shell
if-then-else cont’d
An example:
if ($#argv != 2) then
echo “we need two parameters!“
else
set name1 = $argv[1]
set name2 = $argv[2]
endif
C Shell
Loops
while ( expr )
commandlist
end
foreach var ( worddlist )
commandlist
end
C Shell
switch
switch ( str )
case string1:
commandlist1
breaksw
case string2:
commandlist2
breaksw
default
commandlist
endsw
C Shell
goto (Considered harmful!)
To jump unconditionally:
goto label
A label is a line such as:
label:
The classic paper on why not to use goto:
Go To Statement Considered Harmful
Edsger W. Dijkstra, CACM, March 1968
C Shell
shift command
Moves the values in the parameters toward
the beginning of the parameter list
#!/bin/csh –f
echo “There are” $#argv “parameters\n”
while ($#argv > 0)
echo –n “$argv[1] “
shift
end
echo “\n”
echo “There are now” $#argv “parameters”
echo “end of script”
C Shell
Input
Reading Line by Line
% set x = $<
This is a line.
% echo $x
This is a line.
File Operators
-e
-r
-l
-w
-x
-o
-f
-d
-s
-z
file
file
file
file
file
file
file
file
file
file
:
:
:
:
:
:
:
:
:
:
True
True
True
True
True
True
True
True
True
True
if
if
if
if
if
if
if
if
if
if
file exists
file is readable
file exists and is a symbolic link
file exists and is writable
file exists and is executable
the user owns it
the file exists and is a regular file
the file exists and is a directory
file exists and has a size greater than zero
file length is zero (empty)
Logical operator
! : NEGATE
&& : logical AND
|| : logical OR
Ex)
if (! -e somefile) then
# does not exist
Debugging
%csh –vx somescript args
-v : vervose
-x : echoes the commands after all substitutions are
made
-n : syntax check. No execution
example
#!/bin/csh
if (-e $argv[1]) then
echo $argv[1] exists
else
echo $argv[1] does not exist and cannot be opened
endif
# rest of script here
C Shell
example
#!/bin/csh
set sum = 0
echo –n “Enter a number:
set num = $<
”
while ($num != “”)
@ sum += $num
echo –n “Enter the next number: ”
set num = $<
end
echo “\nThe sum of the number is : $sum”
C Shell
Guidelines
Shell script is better than C program if the problem
can be solved by using UNIX commands
Why script?
Easier to create and modify
Easy to debug
Good thing to do
Use redirection and pipe
Do validity check (argument number , type)
Check existence of files and directories
Display error messages
example
#!/bin/csh
set j = (1 2 3 4 5)
foreach i ($j)
echo $i Hello
end
C Shell
example
#!/bin/csh
set ary = `cat ary.dat`
echo
echo
echo
echo
“The
“The
“The
“The
C Shell
whole array : $ary”
number of elements : $#ary”
first element: $ary[1]”
last element: $ary[$#ary]”
Numeric validation example
#!/bin/csh
echo $argv[2] > temp
grep ‘^[0-9]*$’ temp > /dev/null
if ($status != 0) then
echo “Month argument is not numeric”
exit 1
endif
if ($argv[2] < 1 || $argv[2] > 12) then
echo “Month argument must be <1…12>”
exit 2
endif
echo “Validation is OK. We continue.”
C Shell
example
#! /bin/csh -f
foreach name ($argv)
if ( -f $name ) then
echo -n "delete the file '${name}' (y/n/q)?"
else
echo -n "delete the entire dir '${name}' (y/n/q)? "
endif
set ans = $<
# $< means “read a line”
switch ($ans)
case n:
continue
case q:
exit
case y:
rm -rf $name
continue
endsw
end:
C Shell
Exercise 1
Write a shell script that displays the number
of files and directories in a given directory
format
% ./fd_count.csh directory_name
Exercise 2
Write a shell script that removes duplicate
words from an input text file.
Format
% remove_dup.csh in.txt out.txt
Four
Two
One
One
Four
Two
Two
Three
Four Two One Three
out.txt
in.txt