Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Linux Programming - Lecture Notes On UNIT 2

Download as pdf or txt
Download as pdf or txt
You are on page 1of 69
At a glance
Powered by AI
The key takeaways from the document are that bash shell programming involves sequence, decision-making using if-then-else and case statements, repetition using loops like for, while and until, and defining functions and handling signals.

The main control structures in bash shell programming are decision-making using if-then-else and case statements, and repetition using loops like for, while, until, do-while and select.

In a bash shell script, user input can be obtained using the read command, which prompts the user and assigns the input to variables. The -p option allows specifying a prompt string.

Bash Programming

Basic Shell Programming


A script is a file that contains shell commands
data structure: variables
control structure: sequence, decision, loop
Shebang line for bash shell script:

#! /bin/bash
#! /bin/sh
to run:
make executable: % chmod +x script
invoke via:
% ./script
2

Bash shell programming


Input
prompting user
command line arguments
Decision:
if-then-else
case
Repetition
do-while, repeat-until
for
select
Functions
Traps
3

User input
shell allows to prompt for user input

Syntax:
read varname [more vars]

or
read p "prompt" varname [more vars]

words entered by user are assigned to

varname and more vars


last variable gets rest of input line

User input example


#! /bin/sh
read -p "enter your name: " first last
echo "First name: $first"
echo "Last name: $last"

Special shell variables


Parameter
$0
$1-$9

Meaning
Name of the current shell script
Positional parameters 1 through 9

$#

The number of positional parameters

$*

All positional parameters, $* is one string

$@

All positional parameters, $@ is a set of strings

$?

Return status of most recently executed command

$$

Process id of current process

Examples: Command Line


Arguments
% set tim bill ann fred
$1 $2
$3 $4
% echo $*
tim bill ann fred
% echo $#
4
% echo $1
tim
% echo $3 $4
ann fred

The set
command can
be used to
assign values to
positional
parameters

bash control structures


if-then-else
case
loops
for
while
until
select

if statement
if command
then
statements
fi

statements are executed only if command succeeds,

i.e. has return status 0

test command
Syntax:
test expression
[ expression ]
evaluates expression and returns true or false
Example:
if test w "$1"
then
echo "file $1 is write-able"
fi
10

The simple if statement


if [ condition ]; then
statements
fi

executes the statements only if condition is true

11

The if-then-else statement


if [ condition ]; then
statements-1
else
statements-2
fi

executes statements-1 if condition is true


executes statements-2 if condition is false

12

The ifstate e t
if [ condition ]; then
statements
elif [ condition ]; then
statement
else
statements
fi

The word elif stands for else if


It is part of the if statement and cannot be used by

itself
13

Relational Operators
Meaning

Numeric

String

Greater than

-gt

Greater than or equal

-ge

Less than

-lt

Less than or equal

-le

Equal

-eg

= or ==

Not equal

-ne

!=

str1 is less than str2

str1 < str2

str1 is greater str2

str1 > str2

String length is greater than zero

-n str

String length is zero

-z str
14

Compound logical expressions


!

not
and, or
must be enclosed within

&&
||

and
or

[[

]]

15

Example: Using the ! Operator


#!/bin/bash
read -p "Enter years of work: " Years
if [ ! "$Years" -lt 20 ]; then
echo "You can retire now."
else
echo "You need 20+ years to retire"
fi

16

Example: Using the && Operator


#!/bin/bash
Bonus=500
read -p "Enter Status: " Status
read -p "Enter Shift: " Shift
if [[ "$Status" = "H" && "$Shift" = 3 ]]
then
echo "shift $Shift gets \$$Bonus bonus"
else
echo "only hourly workers in"
echo "shift 3 get a bonus"
fi
17

Example: Using the || Operator


#!/bin/bash
read -p "Enter calls handled:" CHandle
read -p "Enter calls closed: " CClose
if [[ "$CHandle" -gt 150 || "$CClose" -gt 50 ]]
then
echo "You are entitled to a bonus"
else
echo "You get a bonus if the calls"
echo "handled exceeds 150 or"
echo "calls closed exceeds 50"
fi
18

File Testing
-d file
-f file
-r file
-w file
-x file
-s file

Meaning
True if file is a directory
True if file is an ord. file
True if file is readable
True if file is writable
True if file is executable
True if length of file is nonzero

19

Example: File Testing


#!/bin/bash
echo "Enter a filename: "
read filename
if [ ! r "$filename" ]
then
echo "File is not read-able"
exit 1
fi

20

Example: File Testing


#! /bin/bash
if [ $# -lt 1 ]; then
echo "Usage: filetest filename"
exit 1
fi
if [[ ! -f "$1" || ! -r "$1" || ! -w "$1" ]]
then
echo "File $1 is not accessible"
exit 1
fi
21

Exa ple: if tate e t


# The following THREE if-conditions produce the same result
* DOUBLE SQUARE BRACKETS
read -p "Do you want to continue?" reply
if [[ $reply = "y" ]]; then
echo "You entered " $reply
fi
* SINGLE SQUARE BRACKETS
read -p "Do you want to continue?" reply
if [ $reply = "y" ]; then
echo "You entered " $reply
fi
* "TEST" COMMAND
read -p "Do you want to continue?" reply
if test $reply = "y"; then
echo "You entered " $reply
fi
22

Example: if..elif... Statement


#!/bin/bash
read -p "Enter Income Amount: " Income
read -p "Enter Expenses Amount: " Expense

let Net=$Income-$Expense
if [ "$Net" -eq "0" ]; then
echo "Income and Expenses are equal - breakeven."
elif [ "$Net" -gt "0" ]; then
echo "Profit of: " $Net
else
echo "Loss of: " $Net
fi
23

The case Statement


use the case statement for a decision that is based on

multiple choices
Syntax:
case word in
pattern1) command-list1
;;
pattern2) command-list2
;;
patternN) command-listN
;;
esac
24

case pattern
checked against word for match
may also contain:

*
?
[ ]
[:class:]
multiple patterns can be listed via:

|
25

Example 1: The case Statement


#!/bin/bash
echo "Enter Y to see all files including hidden files"
echo "Enter N to see all non-hidden files"
echo "Enter q to quit"
read -p "Enter your choice: " reply
case $reply in
Y|YES) echo "Displaying all (really) files"
ls -a ;;
N|NO) echo "Display all non-hidden files..."
ls ;;
Q)
exit 0 ;;
*) echo "Invalid choice!"; exit 1 ;;
esac

26

Example 2: The case Statement


#!/bin/bash
ChildRate=3
AdultRate=10
SeniorRate=7
read -p "Enter your age: " age
case $age in
[1-9]|[1][0-2])
# child, if age 12 and younger
echo "your rate is" '$'"$ChildRate.00" ;;
# adult, if age is between 13 and 59 inclusive
[1][3-9]|[2-5][0-9])
echo "your rate is" '$'"$AdultRate.00" ;;
[6-9][0-9])
# senior, if age is 60+
echo "your rate is" '$'"$SeniorRate.00" ;;
esac
27

Bash programming: so far


Data structure
Variables
Numeric variables
Arrays
User input
Control structures
if-then-else
case

28

Bash programming: still to come


Control structures
Repetition

do-while, repeat-until
for
select

Functions
Trapping signals

29

Repetition Constructs

30

The while Loop


Purpose:

To execute commands in command-list as long as


expression evaluates to true
Syntax:
while [ expression ]
do
command-list
done
31

Example: Using the while Loop


#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]
do
echo The counter is $COUNTER
let COUNTER=$COUNTER+1
done

32

Example: Using the while Loop


#!/bin/bash
Cont="Y"
while [ $Cont = "Y" ]; do
ps -A
read -p "want to continue? (Y/N)" reply
Cont=`echo $reply | tr [:lower:] [:upper:]`
done
echo "done"

33

Example: Using the while Loop


#!/bin/bash
# copies files from home- into the webserver- directory
# A new directory is created every hour
PICSDIR=/home/carol/pics
WEBDIR=/var/www/carol/webcam
while true; do
DATE=`date +%Y%m%d`
HOUR=`date +%H`
mkdir $WEBDIR/"$DATE"
while [ $HOUR -ne "00" ]; do
DESTDIR=$WEBDIR/"$DATE"/"$HOUR"
mkdir "$DESTDIR"
mv $PICSDIR/*.jpg "$DESTDIR"/
sleep 3600
HOUR=`date +%H`
done
done

34

The until Loop


Purpose:

To execute commands in command-list as long as


expression evaluates to false
Syntax:
until [ expression ]
do
command-list
done
35

Example: Using the until Loop


#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]
do
echo $COUNTER
let COUNTER-=1
done

36

Example: Using the until Loop


#!/bin/bash
Stop="N"
until [ $Stop = "Y" ]; do
ps -A
read -p "want to stop? (Y/N)" reply
Stop=`echo $reply | tr [:lower:] [:upper:]`
done
echo "done"

37

The for Loop


Purpose:

To execute commands as many times as the


number of words in the argument-list
Syntax:
for variable in argument-list
do
commands
done
38

Example 1: The for Loop


#!/bin/bash
for i in 7 9 2 3 4 5
do
echo $i
done

39

Example 2: Using the for Loop


#!/bin/bash
# compute the average weekly temperature
for num in 1 2 3 4 5 6 7
do
read -p "Enter temp for day $num: " Temp
let TempTotal=$TempTotal+$Temp
done
let AvgTemp=$TempTotal/7
echo "Average temperature: " $AvgTemp
40

looping over arguments


simplest form will iterate over all command line

arguments:

#! /bin/bash
for parm
do
echo $parm
done

41

Select command
Constructs simple menu from word list
Allows user to enter a number instead of a word
User enters sequence number corresponding to the

word
Syntax:
select WORD in LIST
do
RESPECTIVE-COMMANDS
done
Loops until end of input, i.e. ^d (or ^c)
42

Select example
#! /bin/bash
select var in alpha beta gamma
do
1) alpha
2) beta
echo $var
3) gamma
done
Prints:

#? 2
beta
#? 4
#? 1
alpha

43

Select detail
Output:
PS3 is select sub-prompt
select ...
$REPLY is user input (the number)
1) alpha
2) beta
? 2
#! /bin/bash
2 = beta
PS3="select entry or ^D: " ? 1
1 = alpha
select var in alpha beta

do
echo "$REPLY = $var"
done
44

Select example
#!/bin/bash
echo "script to make files private"
echo "Select file to protect:"
select FILENAME in *
do
echo "You picked $FILENAME ($REPLY)"
chmod go-rwx "$FILENAME"
echo "it is now private"
done
45

break and continue


Interrupt for, while or until loop
The break statement
transfer control to the statement AFTER the done
statement
terminate execution of the loop
The continue statement
transfer control to the statement TO the done
statement
skip the test statements for the current iteration
continues execution of the loop
46

The break command


while [ condition ]
do
cmd-1
break
cmd-n
done
echo "done"

This iteration is over


and there are no more
iterations

47

The continue command


while [ condition ]
do
cmd-1
continue
cmd-n
done
echo "done"

This iteration is
over; do the next
iteration

48

Example:
for index in 1 2 3 4 5 6 7 8 9 10
do
if [ $index le 3 ]; then
echo "continue"
continue
fi
echo $index
if [ $index ge 8 ]; then
echo "break"
break
fi
done
49

Bash shell programming


Sequence
Decision:
if-then-else
case
Repetition
do-while, repeat-until
for
select
Functions
Traps

DONE !

still to come

50

Shell Functions
A shell function is similar to a shell script
stores a series of commands for execution later
shell stores functions in memory
shell executes a shell function in the same shell that
called it
Where to define
In .profile
In your script
Or on the command line
Remove a function
Use unset built-in
51

Shell Functions
must be defined before they can be referenced
usually placed at the beginning of the script

Syntax:
function-name () {
statements
}

52

Example: function
#!/bin/bash
funky () {
# This is a simple function
echo "This is a funky function."
echo "Now exiting funky function."
}
# declaration must precede call:
funky
53

Example: function
#!/bin/bash
fun () { # A somewhat more complex function.
JUST_A_SECOND=1
let i=0
REPEATS=30
echo "And now the fun really begins."
while [ $i -lt $REPEATS ]
do
echo "-------FUNCTIONS are fun-------->"
sleep $JUST_A_SECOND
let i+=1
done
}
fun
54

Function parameters
Need not be declared
Arguments provided via function call are

accessible inside function as $1, $2, $3,

$#
$0

reflects number of parameters


still contains name of script
(not name of function)

55

Example: function with parameter


#! /bin/sh
testfile() {
if [ $# -gt 0 ]; then
if [[ -f $1 && -r $1 ]]; then
echo $1 is a readable file
else
echo $1 is not a readable file
fi
fi
}
testfile .
testfile funtest
56

Example: function with parameters


#! /bin/bash
checkfile() {
for file
do
if [ -f "$file" ]; then
echo "$file is a file"
else
if [ -d "$file" ]; then
echo "$file is a directory"
fi
fi
done
}
checkfile . funtest
57

Local Variables in Functions


Variables defined within functions are global,

i.e. their values are known throughout the entire


shell program
keyword local inside a function definition makes

referenced variables local to that function

58

Example: function
#! /bin/bash
global="pretty good variable"
foo () {
local inside="not so good variable"
echo $global
echo $inside
global="better variable"
}
echo $global
foo
echo $global
echo $inside
59

Handling signals
Unix allows you to send a signal to any process

-1 = hangup
-2 = interrupt with ^C
no argument = terminate
-9 = kill
kill

kill -HUP 1234


kill -2 1235
kill 1235
-9 1236

-9 cannot be blocked

list your processes with


ps -u userid
60

Signals on Linux
% kill -l
1) SIGHUP
5) SIGTRAP
9) SIGKILL
13) SIGPIPE
17) SIGCHLD
21) SIGTTIN
25) SIGXFSZ
29) SIGIO
35) SIGRTMIN+1
39) SIGRTMIN+5
43) SIGRTMIN+9
47) SIGRTMIN+13
51) SIGRTMAX-13
55) SIGRTMAX-9
59) SIGRTMAX-5
63) SIGRTMAX-1

2)
6)
10)
14)
18)
22)
26)
30)
36)
40)
44)
48)
52)
56)
60)
64)

SIGINT
SIGABRT
SIGUSR1
SIGALRM
SIGCONT
SIGTTOU
SIGVTALRM
SIGPWR
SIGRTMIN+2
SIGRTMIN+6
SIGRTMIN+10
SIGRTMIN+14
SIGRTMAX-12
SIGRTMAX-8
SIGRTMAX-4
SIGRTMAX

3)
7)
11)
15)
19)
23)
27)
31)
37)
41)
45)
49)
53)
57)
61)

SIGQUIT
SIGBUS
SIGSEGV
SIGTERM
SIGSTOP
SIGURG
SIGPROF
SIGSYS
SIGRTMIN+3
SIGRTMIN+7
SIGRTMIN+11
SIGRTMIN+15
SIGRTMAX-11
SIGRTMAX-7
SIGRTMAX-3

4)
8)
12)
16)
20)
24)
28)
34)
38)
42)
46)
50)
54)
58)
62)

SIGILL
SIGFPE
SIGUSR2
SIGSTKFLT
SIGTSTP
SIGXCPU
SIGWINCH
SIGRTMIN
SIGRTMIN+4
SIGRTMIN+8
SIGRTMIN+12
SIGRTMAX-14
SIGRTMAX-10
SIGRTMAX-6
SIGRTMAX-2

^C is 2 - SIGINT

61

Handling signals
Default action for most signals is to end process
term: signal handler
Bash allows to install custom signal handler

Syntax:
trap 'handler commands' signals

Example:
trap 'echo do not hangup'

1 2
62

Example: trap hangup


#! /bin/bash
# kill -1 wont kill this process
# kill -2 will
trap 'echo dont hang up' 1
while true
do
echo "try to hang up"
sleep 1
done
63

Example: trap multiple signals


#! /bin/sh
# plain kill or kill -9 will kill this
trap 'echo 1' 1
trap 'echo 2' 2
while true; do
echo -n .
sleep 1
done
64

Example: removing temp files


#! /bin/bash
trap 'cleanup; exit' 2
cleanup () {
/bin/rm -f /tmp/tempfile.$$.?
}
for i in 1 2 3 4 5 6 7 8
do
echo "$i.iteration"
touch /tmp/tempfile.$$.$i
sleep 1
done
cleanup
65

Restoring default handlers


trap without a command list will remove a signal handler
Use this to run a signal handler once only

#! /bin/sh
trap 'justonce' 2
justonce() {
echo "not yet"
trap 2
}

# now reset it

while true; do
echo -n "."
sleep 1
done
66

Debug Shell Programs


Debugging is troubleshooting errors that may

occur during the execution of a program/script


The following two commands can help you debug a
bash shell script:
echo

use explicit output statements to trace execution


set

67

Debuggi g usi g set


The set command is a shell built-in command
has options to allow flow of execution
v option prints each line as it is read
x option displays the command and its arguments
n checks for syntax errors
options can turned on or off
To turn on the option: set -xv
To turn off the options: set +xv
Options can also be set via she-bang line

#! /bin/bash -xv
68

Summary: Bash shell programming


Sequence
Decision:
if-then-else
case
Repetition
do-while, repeat-until
for
select
Functions
Traps

DONE !

69

You might also like