linux tools shell script.. computer science
BASH SHELL PROGRAMMING
- Input
- prompting user
- command line arguments
- Decision:
- if-then-else
- case
- Repetition
- do-while, repeat-until
- for
- select
- Functions
- Traps
*
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"
*
BASH CONTROL STRUCTURES
- if-then-else
- case
- loops
- for
- while
- until
- select
*
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 |
COMPOUND LOGICAL EXPRESSIONS
! not
&& and
|| or
*
and, or
must be enclosed within
[[ ]]
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
*
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
*
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
*
FILE TESTING
Meaning
-d file True if ‘file’ is a directory
-f file True if ‘file’ is an ord. file
-r file True if ‘file’ is readable
-w file True if ‘file’ is writable
-x file True if ‘file’ is executable
-s file True if length of ‘file’ is nonzero
*
EXAMPLE: FILE TESTING
#!/bin/bash
echo "Enter a filename: "
read filename
if [ ! –r "$filename" ]
then
echo "File is not read-able"
exit 1
fi
*
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
*
EXAMPLE: IF… STATEMENT
# 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
*
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
*
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
*
CASE PATTERN
- checked against word for match
- may also contain:
*
?
[ … ]
[:class:]
- multiple patterns can be listed via:
|
*
[:digit:]
Digits: 0 1 2 3 4 5 6 7 8 9
[:alnum:]
Alphanumeric
[:alpha:]
[:lower:]
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
*
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
*
BASH PROGRAMMING: SO FAR
- Data structure
- Variables
- Numeric variables
- Arrays
- User input
- Control structures
- if-then-else
- case
*
BASH PROGRAMMING: STILL TO COME
- Control structures
- Repetition
- do-while, repeat-until
- for
- select
- Functions
- Trapping signals
*
The Bash Shell
The Bash Shell
Copyright Department of Computer Science, Northern Illinois University, 2005
09-*
Copyright Department of Computer Science, Northern Illinois University, 2005
THE WHILE LOOP
- Purpose:
To execute commands in “command-list” as long as “expression” evaluates to true
Syntax:
while [ expression ]
do
command-list
done
*
EXAMPLE: USING THE WHILE LOOP
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]
do
echo The counter is $COUNTER
let COUNTER=$COUNTER+1
done
*
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"
*
Translate from lower case to upper case
THE UNTIL LOOP
- Purpose:
To execute commands in “command-list” as long as “expression” evaluates to false
Syntax:
until [ expression ]
do
command-list
done
*
EXAMPLE: USING THE UNTIL LOOP
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]
do
echo $COUNTER
let COUNTER-=1
done
*
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"
*
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
*
EXAMPLE 1: THE FOR LOOP
#!/bin/bash
for i in 7 9 2 3 4 5
do
echo $i
done
*
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
*
LOOPING OVER ARGUMENTS
- simplest form will iterate over all command line arguments:
#! /bin/bash
for parm
do
echo $parm
done
*
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)
*
SELECT EXAMPLE
#! /bin/bash
select var in alpha beta gamma
do
echo $var
done
- Prints:
*
1) alpha
2) beta
3) gamma
#? 2
beta
#? 4
#? 1
alpha
SELECT DETAIL
- PS3 is select sub-prompt
- $REPLY is user input (the number)
#! /bin/bash
PS3="select entry or ^D: "
select var in alpha beta
do
echo "$REPLY = $var"
done
*
Output:
select entry or ^D:
1) alpha
2) beta
? 2
2 = beta
? 1
1 = alpha
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
*
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
*
The Bash Shell
*
Copyright Department of Computer Science, Northern Illinois University, 2005
THE BREAK COMMAND
while [ condition ]
do
cmd-1
break
cmd-n
done
echo "done"
*
This iteration is over and there are no more iterations
The Bash Shell
The Bash Shell
Copyright Department of Computer Science, Northern Illinois University, 2005
09-*
Copyright Department of Computer Science, Northern Illinois University, 2005
THE CONTINUE COMMAND
while [ condition ]
do
cmd-1
continue
cmd-n
done
echo "done"
*
This iteration is over; do the next iteration
The Bash Shell
The Bash Shell
Copyright Department of Computer Science, Northern Illinois University, 2005
09-*
Copyright Department of Computer Science, Northern Illinois University, 2005
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
*
The Bash Shell
*
Copyright Department of Computer Science, Northern Illinois University, 2005
DONE !
BASH SHELL PROGRAMMING
- Sequence
- Decision:
- if-then-else
- case
- Repetition
- do-while, repeat-until
- for
- select
- Functions
- Traps
*
still to come
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
*
The Bash Shell
*
Copyright Department of Computer Science, Northern Illinois University, 2005
SHELL FUNCTIONS
- must be defined before they can be referenced
- usually placed at the beginning of the script
Syntax:
function-name () {
statements
}
*
The Bash Shell
Copyright Department of Computer Science, Northern Illinois University, 2005
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
*
The Bash Shell
Copyright Department of Computer Science, Northern Illinois University, 2005
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
*
FUNCTION PARAMETERS
- Need not be declared
- Arguments provided via function call are accessible inside function as $1, $2, $3, …
$# reflects number of parameters
$0 still contains name of script
(not name of function)
*
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 *
*
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 $1 $2 $3
*
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
*
EXAMPLE: FUNCTION
#! /bin/bash
global="pretty good variable"
foo () {
xyz=124
echo “xyz inside function = $xyz”
local rrr="not so good variable"
echo $global
echo $rrr
global="better variable"
}
echo “xyz outside function = $xyz”
echo $global
foo
echo $global
echo $rrr
*
RECURSION;
FUNCTIONS CAN BE RECURSIVE - HERE'S A SIMPLE EXAMPLE OF A FACTORIAL FUNCTION:
*
HANDLING SIGNALS
- Unix allows you to send a signal to any process
- -1 = hangup kill -HUP 1234
- -2 = interrupt with ^C kill -2 1235
- no argument = terminate kill 1235
- -9 = kill kill -9 1236
- -9 cannot be blocked
- list your processes with
ps -u userid
*
LIST OF THE COMMONLY USED SIGNAL NUMBERS, DESCRIPTION AND WHETHER THEY CAN BE TRAPPED OR NOT:
*
SIGNALS ON LINUX
% kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
- ^C is 2 - SIGINT
*
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
*
EXAMPLE: TRAP HANGUP
#! /bin/bash
trap 'echo dont terminate me’ 2
while true
do
echo "try to terminate"
sleep 1
done
*
EXAMPLE: TRAP MULTIPLE SIGNALS
#! /bin/sh
trap 'echo 2’ 2
trap 'echo 3’ 3
while true; do
echo -n .
sleep 1
done
*
EXAMPLE: REMOVING TEMP FILES
#! /bin/bash
cleanup () {
/bin/rm -f /tmp/tempfile.$$.?
}
trap 'cleanup; exit' 2
for i in 1 2 3 4 5 6 7 8
do
echo "$i.iteration"
touch /tmp/tempfile.$$.$i
sleep 1
done
cleanup
*
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
*
DONE !
SUMMARY: BASH SHELL PROGRAMMING
- Sequence
- Decision:
- if-then-else
- case
- Repetition
- do-while, repeat-until
- for
- select
- Functions
- Traps
*