0% found this document useful (0 votes)
18 views

Linux 06

Uploaded by

Himani Verma
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
18 views

Linux 06

Uploaded by

Himani Verma
Copyright
© © All Rights Reserved
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 51

LINUX System : Lecture 6

Shell Programming

Acknowledgement: Prof. McCourt lecture notes


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) into
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 Bourne Shell
 ksh Korn Shell
 bash Bourne-Again Shell
 Most common shell in Linux
 Default for most Linux machines and OSX
 Developed by GNU project
 csh,tcsh C Shell : similar to C language
 Default for BSD-based systems
 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.
 Any commands you enter in response to a shell prompt.
 A utility
 A compiled program
 Another shell script
 Control flow commands
 Run a shell script
 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
 Used to provide information to programs

 (Global) environment variable


 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 operators
 must be used with the arithmetic (@)
command
 Arithmetic command works only with
integers.

set count = 5
@ count += 2
echo $count
7
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
set tmp = $argv[1]
cp $argv[1] tmp_file
cp $argv[2] $argv[1]
cp tmp_file $argv[2]

Arguments : $argv
The number of arguments to a script: $#argv

C Shell
if-then-else

if ( expr ) simple-command

if ( expr ) then
commandlist-1
[else
commandlist-2]
endif

C Shell
if-then-else exampe

#! /bin/csh
if ($#argv != 2) then
echo "we need two parameters!"
else
set tmp = $argv[1]
cp $argv[1] tmp_file
cp $argv[2] $argv[1]
cp tmp_file $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 file : True if file exists
-r file : True if file is readable
-l file : True if file exists and is a symbolic link
-w file : True if file exists and is writable
-x file : True if file exists and is executable
-o file : True if the user owns it
-f file : True if the file exists and is a regular file
-d file : True if the file exists and is a directory
-s file : True if file exists and has a size greater than zero
-z file : True if 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 “The whole array : $ary”


echo “The number of elements : $#ary”
echo “The first element: $ary[1]”
echo “The last element: $ary[$#ary]”

C Shell
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 Four Two One Three
One out.txt
Four
Two
in.txt
Two
Three
Bash Shell
• Shell beginning
#!/bin/bash
# This is the beginning of a shell script

• Setting Variables
> MYVAR=“a new variable”
> echo $MYVAR
A new variable

> x=3
> echo $x
3
> export seven=7
> echo $seven
7
Command Output
 In order to use the output of a command within
our script, we must set it apart using backticks
 `command`
 Or $(command)

#!/bin/bash
echo date
echo `date`
echo $(date)
Test
 To test an expression, use one of
these :
 test EXPRESSION
 [EXPRESSION]
 Returns 0 if true, 1 if false
File Tests
Control Structures
 Example
#! /bin/bash
if [ $? -eq 0 ]
then echo "Last command exited cleanly!"
fi

#! /bin/bash
if [ $? -eq 0 ]
then echo "Last command exited cleanly!"
else echo "Uh-oh - non-zero exit status!"
fi
Arguments
 $1, $2, $3, etc.
 each argument passed to our script is
assigned a variable
 $0
 stores the name of the script
 $#
 gives us the number of arguments
#! /bin/bash
if [ ! $# -eq 3 ]
then echo "Correct usage: $0 arg1 arg2 arg3"
exit
fi
Arithmetics
Arithmetics
 Let built-in
let VAR=$1+15

 $[expression]
echo $[ 323*17 ]
Arrays
 declare -a arrayname
 arrayname[index_number]=value
 arrayname=(value1 value2 ... valueN)

 Accessing Array Element


 ${arrayname[index]}
> array=(’Cornell University’ CS2042 ’Intro to Unix’)
> echo ${array[2]}
Intro to Unix
Multiple Options
#! /bin/bash
# This script prints the # of days in the month.
MONTH=$(date +%b)
case $MONTH in
Jan|Mar|May|Jul|Aug|Oct|Dec)
NUMDAYS=31;;
Apr|Jun|Sep|Nov)
NUMDAYS=30;;
Feb) NUMDAYS=28;;
esac
echo “This month of $MONTH has $NUMDAYS days.”
exit
while loop
 while condition; do command-list; done
 Executes command-list until ’condition’ no longer returns true
 When ’condition’ fails, the script continues with the command
following ’done’
 ’condition’ can be any expression or command that returns a
status
for loop
 for name in word; do list; done
 Expands word into a list of items
 Replaces name with each item as it performs list

 Example1
#! /bin/bash
for FILE in `ls *.txt`; do cp $FILE $FILE.bak; done
function
 Shell functions are a way to group
commands together for later execution,
using a single name for the group.

 Function syntax
 function name { commands; }
 name() { commands; }
Local/Global Variables
 Example
#! /bin/bash
VAR=”global variable”
function func {
local VAR=”local variable”
echo $VAR; }
# Execute our new function!
func
echo $VAR
Function Parameters
 Example
#! /bin/bash
function function_A {
echo $1; }
function_A “A function parameter!”
echo $1

You might also like