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