shell scripting

75
Shell Scripting UNIT V

Upload: gaurav-shinde

Post on 14-May-2015

1.370 views

Category:

Education


1 download

TRANSCRIPT

Page 1: Shell Scripting

Shell Scripting

UNIT V

Page 2: Shell Scripting

Introduction

ShellInterface to the userCommand interpreterProgramming features

Page 3: Shell Scripting

Shell Scripting A shell program is nothing but a series of commands We give the to-do list – a prg- that carries out an

entire procedure. Such programs are known as “shell scripts”

Automating command execution Batch processing of commands Repetitive tasks

Page 4: Shell Scripting

Shells in Linux

•Many shells available•Examples -sh, ksh, csh, bash•Bash is most popular

Page 5: Shell Scripting

Shell’s Relationship to the User and the Hardware

Page 6: Shell Scripting

When to use shell scriptsShell scripts can be used for a variety of tasks•Customizing your work environment

•Every time login to see current date, welcome message etc•Automating your daily tasks

•To take backup all your programs at the end of the day•Automating repetitive tasks

•Producing sales report of every month etc•Executing important system procedures

•Shutdown, formatting a disk, creating a file system on it, mounting and un mounting the disk etc

•Performing same operation on many files•Replacing printf with myprintf in all C programs present in a dir etc

Page 7: Shell Scripting

When not to use shell scripts

When the task :• is too complex such as writing entire billing system•Require a high degree of efficiency•Requires a variety of software tools

Page 8: Shell Scripting

The Bourne Again Shell

Abbreviated bash

Default in most Linux distributions

Most widely used on all UNIX platforms

Derives features from ksh, csh, sh, etc.

Page 9: Shell Scripting

BASH Programming featuresSupport for many programming features

- variables, arrays, loops, decision operators, functions, positional parameters

Pipes, I/O re-direction

Misc. features - expansions, job control

Built in Commands - read, echo, source, alias

Page 10: Shell Scripting

Shell keywords

• These are words whose meaning has already been explained to shell• We cannot use as variable names• Also called as reserved wordsecho if until trapread else case waitset fi esac evalunset while break execshift do continue ulimitexport done exit umaskreadonly for return

Page 11: Shell Scripting

In Linux (Shell), there are two types of variable:(1) System variables - Created and maintained by Linux itself. This type of variable defined in CAPITAL LETTERS.(2) User defined variables (UDV) - Created and maintained by user. This type of variable defined in lower letters.

Page 12: Shell Scripting

BASH=/bin/bash Our shell name HOME=/home/vivek Our home directory LOGNAME=students Our logging name PATH=/usr/bin:/sbin:/bin:/usr/sbin Our path settings PS1=[\u@\h \W]\$ Our prompt settings PWD=/home/students/Common Our current working

directory SHELL=/bin/bash Our shell name USERNAME=vivek User name who is currently login to

this PC

TERM =xterm name of the terminal on which you are working

We can see all the system variables and their values using

$set or env

Page 13: Shell Scripting

How to define User defined variables (UDV)

To define UDV use following syntax: variable name=value

'value' is assigned to given 'variable name' and Value must be on right side = sign.

Example:$ no=10# this is ok$ 10=no# Error, NOT Ok, Value must be on right side of = sign.To define variable called 'vech' having value Bus$ vech=BusTo define variable called n having value 10$ n=10

Page 14: Shell Scripting

Rules for Naming variable name (Both UDV and System Variable) Variable name must begin with Alphanumeric character or

underscore character (_), followed by one or more Alphanumeric character.

e.g. HOME,SYSTEM_VERSION,vech,no Don't put spaces on either side of the equal sign when assigning

value to variable. e.g. $ no=10

Variables are case-sensitive. e.g.

$ no=10$ No=11

Define NULL variable as follows. e.g.

$ vech=$ vech=""

Do not use ?,* etc, to name variable names.

Page 15: Shell Scripting

To print or access UDV use following syntaxSyntax: $variablename

Unset is used to wipe of shell variables

$unset a

We cannot wipeout system variables

$unset PS1 // will not work To declare constants we use readonly key word

$a=20

$readonly a

Shell does not allow us to change the value of a

$readonly // display all readonly vars

Page 16: Shell Scripting

echo Command

Use echo command to display text or value of variable.

echo [options] [string, variables...]Options

-n Do not output the trailing new line.-e Enable interpretation of the following

\a alert (bell)\b backspace\c suppress trailing new line\n new line\r carriage return\t horizontal tab\\ backslash

Page 17: Shell Scripting

Quoting example

$ echo Today is dateToday is date

$ echo Today is `date`Today is Thu Sep 19 12:28:55 EST 2002

$ echo ”Today is `date`”Today is Thu Sep 19 12:28:55 EST 2002

$ echo ’Today is `date`’Today is `date`

Page 18: Shell Scripting

Shell Arithmetic Use to perform arithmetic operations. Syntax:

expr op1 math-operator op2 Examples:

$ expr 1 + 3 ; $ expr 10 / 2$ expr 20 % 3 ; $ expr 10 \* 3$ echo `expr 6 + 3`

expr is capable of carrying out only integer arithmetic For float operations we have to use bc command Ex: a=10.5;b=3.5

c=`echo $a + $b | bc`

Page 19: Shell Scripting

Starting Shell Scripting

A Simple Shell Script -

1.#!/bin/bash

2.# testfile.sh

3.# Uses the date,cal,shell to display

4.# date,calander & shell of system

5. echo "Displaying date: `date`”

6. echo "Displaying calander: `cal`”

7. echo “My shell :$SHELL”

Page 20: Shell Scripting

Running A Shell Script - Method1$ chmod +x testfile.sh$ ./testfile.sh

Method 2$ bash testfile.sh

Options of sh Command-n : Read commands, but does not execute them.-v : Prints the input to the shell as the shell reads it.-x : Prints command lines and their arguments as they are executed

. This option is used mostly for debugging.

Starting Shell Scripting

Page 21: Shell Scripting

The read Statement

Use to get input (data from user) from keyboard and store (data) to variable.Syntax: read variable1, variable2,...variableN

#Script to read your name from key-boardecho “Enter any two numbers:"read n1 n2n3=`expr $n1 + $n2` echo " n3=$n3"

Page 22: Shell Scripting

Wild cards

* Matches any string or group of characters

Ex $ ls * will show all files ? Matches any single character

Ex $ ls f?  will show all files whose names are 2 character long and start with ‘f’.

[...] Matches any one of the enclosed characters

Ex $ ls [abc]* will show all files beginning with letters a/b/c

Page 23: Shell Scripting

More command on one command line

Syntax:command1;command2To run two command with one command line.

Examples: $ date;who Will print today's date followed by users who are currently login.

Note that You can't use $ date who for same purpose

Page 24: Shell Scripting

Why Command Line arguments required

Telling the command/utility which option to use.

Informing the utility/command which file or group of files to process (reading/writing of files).

$ myshell foo bar

1 - Shell Script name i.e. myshell

2 -  First command line argument passed to myshell i.e. foo

3- Second command line argument passed to myshell i.e. bar

Page 25: Shell Scripting

Command line arguments

$1,$2…$9 –positional parameter representing command line args

$# -total no. of args $0 –name of executed command $* -complete set of positional parameters $? –exit status of last command $$ - pid of current shell $! -pid of last background process

Page 26: Shell Scripting

Setting values of Positional parameters

•We can’t assign values to positional parameters directly1)$set hello cs students2)$set `cat f1` //f1 is a file•If quoting meta characters are used the command given with in the `` (reverse quotes) is replaced by the output•Set command can set positional parameters upto 9 If we use more we can’t access after 1 directly

eg: $set a b c d e f g h I j k l $echo $10 $11

a0 a1 To access after 9 use shiftEg: $shift 2First 2 words gone and lost forever

Page 27: Shell Scripting

Conditional execution i.e. && and || The logical operators are && (read as AND) and

|| (read as OR). The syntax for AND list is as follows :

command1 && command2command2 is executed if, and only if, command1 returns an exit status of zero.(success)

e.g grep “date” mydate && echo “pattern found” The syntax for OR list as follows :

command1 || command2command2 is executed if and only if command1 returns a non-zero exit status.(failure)

e.g. grep “date” mydate || echo “pattern not found”

Page 28: Shell Scripting

Conditional execution i.e. && and ||

You can use both as followscommand1 && comamnd2 (if exist status is zero) || command3 (if exit status is non-zero)if command1 is executed successfully then shell will run command2 and if command1 is not successful then command3 is executed.

Example:$ rm myf && echo "File is removed successfully" || echo "File is not removed"

If file (myf) is removed successfully, then "echo File is removed successfully" statement is executed, otherwise "echo File is not removed" statement is executed

Page 29: Shell Scripting

BASH FeaturesDecision operators if

if <condition>then

<do something>else

<do something else>fi

Can use the 'test' command for conditionif test $a = $bthen

echo $afi

Page 30: Shell Scripting

Test & [ ]

The test CommandThe test command is a built-in shell command that evaluat

es the expression given to it as an argument and return true if the expression is true, if otherwise, false

Invoking test with BracketsYou can use square brackets ( [ ] ) instead of the word test

. Compares two strings or a single one for a null value Compares two numbers Checks files attributes

Page 31: Shell Scripting

Numeric comparison

test number1 numeric test operator number2

-eq Is number 1 equal to number2 ?-ne Is number1 not equal to number2 ?-gt Is number 1 great than number2 ?-ge Is number1 great than or equal to number2 ?-lt Is number 1 less than number2 ?-le Is number1 less than or equal to number2 ?

Page 32: Shell Scripting

String comparison

= string1 = string2 Does string1 match string2?!= string1 != string2 Does string1 not match string2?-n -n string Does string contain characters

(nonzero length)?-z -z string Is string an empty string

(zero length)?

Page 33: Shell Scripting

File related tests

-f file file exists & is regular -r file file exists & is readable -w file file exists & is writable -x file file exists & is executable -d file file exists & is directory -s file file exists & has size greater than

zero f1 –nt f2 f1 is newer than f2 f1 –ot f2 f1 is older than f2 f1 –ef f2 f1 is linked to f2

Page 34: Shell Scripting

Numeric data

#!/bin/shecho -e "enter two numbers:\n"read n1 n2if [ $n1 -gt $n2 ]then echo "$n1 is greater"else

echo "$n2 is greater"fi

Run it as:$ sh test.shenter two numbers:3 55 is greater

Page 35: Shell Scripting

String data

echo “enter the string to be searched:”read patif [ -z $pat ]; thenecho “ you have not entered string”; exit 1fiecho “enter the file name:”read fnameif [ ! -n $fname ]; thenecho “ you have not entered filename”; exit 2figrep $pat $fname

Page 36: Shell Scripting

File data

echo “enter file name:”read fnameif [ ! –e fname ]; thenecho “ file does not exist”elif [ ! –r fname ]; thenecho “file is not readable”elif [ ! –w fname ]; thenecho “file is not writable “else

echo “file is both readable & writable”fi

Page 37: Shell Scripting

Example of if statement

$ cat > showfile#!/bin/sh#Script to print fileif cat $1thenecho -e "\n\n File $1, found"fi

Run above script as:$ chmod 755 showfileOR

$./showfile foo

Page 38: Shell Scripting

BASH Features: Loops

forfor VAR in LISTdo <something>done

whilewhile <condition>do <something>done

untilNote that in each and every loop,(a) First, the variable used in loop condition must be initialized, then execution of the loop begins.(b) A test (condition) is made at the beginning of each iteration.(c) The body of loop ends with a statement that modifies the value of the test (condition) variable.

Page 39: Shell Scripting

Example of for loop#!/bin/shfor i in 1 2 3 4 5do

echo "Welcome $i times“doneRun it above script as follows:

$ chmod +x testfor$ ./testfor

The for loop first creates i variable and assigned a number to i from the list of number from 1 to 5, The shell execute echo statement for each assignment of i.

This process will continue until all the items in the list were not finished, because of this it will repeat 5 echo statements.

Page 40: Shell Scripting

#!/bin/sh#Script to test for loopif [ $# -eq 0 ]thenecho "Error - Number missing form command line argument"echo "Syntax : $0 number"echo "Use to print multiplication table for given number"exit 1fin=$1for i in 1 2 3 4 5 6 7 8 9 10doecho "$n * $i = `expr $i \* $n`"done

run it as:$ chmod 755 mtable$ ./mtable 7

7 * 1 = 77 * 2 = 14.....7 * 10 = 70

Page 41: Shell Scripting

#!/bin/shfor (( i = 1; i <= 5; i++ ))      ### Outer for loop ###

do

    for (( j = 1 ; j <= 5; j++ )) ### Inner for loop ###    do          echo -n "$i "    done

  echo "" #### print the new line ###

done Run the above script as follows:

$ chmod u+x nestedfor.sh$ ./nestefor.sh1 1 1 1 12 2 2 2 23 3 3 3 34 4 4 4 45 5 5 5 5

Page 42: Shell Scripting

While loop #!/bin/sh

#Script to test while statementif [ $# -eq 0 ]then   echo "Error - Number missing from command line argument"   echo "Syntax : $0 number"   echo " Use to print multiplication table for given number"exit 1fin=$1i=1while [ $i -le 10 ]do  echo "$n * $i = `expr $i \* $n`"  i=`expr $i + 1`done

Run the above script as follows:$ chmod 755 nt1$./nt1 7

Page 43: Shell Scripting

The case Statement

The case statement is good alternative to Multilevel if-then-else-fi statement.

It enable you to match several values against one variable. Its easier to read and write.

case $variable-name in

pattern1) command ... .. command;;

pattern2) command ... .. command;;

patternN) command ... .. command;;

*) command ... .. command;;

esac

Page 44: Shell Scripting

Case example

echo -e "1.List of files\n2.No. of processes\n3.Today's date\n4.Logged users\n5.exit\n"echo "Enter your choice"read chcase $ch in1)ls ;;2)ps ;;3)date ;;4)who ;;5)exit ;;*) echo "Wrong choice, enter again“esac

Page 45: Shell Scripting

Case Statement - an example#!/bin/shecho -n "Hit a key, then hit Enter: "read keycase "$key" in a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z)echo "$key is a lower case.";;

A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z)echo "$key is an upper case.";;

0|1|2|3|4|5|6|7|8|9)echo "$key is a number.";;

*) echo "$key is a punctuation.";;

esac

Page 46: Shell Scripting

Case Statement - a better example#!/bin/shread -n1 -p "Hit a key: " keyechocase "$key" in [a-z]) echo "$key is a lower case." ;; [A-Z]) echo "$key is an upper case.";;

[0-9]) echo "$key is a number.";;

*) echo "$key is a punctuation.";;

esac

Page 47: Shell Scripting

Example of case statement

#!/bin/shif [ -z $1 ]

then  rental="*** Unknown vehicle ***"elif [ -n $1 ]then

# otherwise make first arg as rental  rental=$1

ficase $rental in

   "car") echo "For $rental Rs.20 per km";;   "van") echo "For $rental Rs.10 per km";;   "jeep") echo "For $rental Rs.5 per km";;   "bicycle") echo "For $rental 20 paisa per km";;   *) echo "Sorry, I can not get a $rental for you";;

esac run it as follows:

$ chmod +x car$ car van$ car car$ car Maruti-800

Page 48: Shell Scripting

How to de-bug the shell script?

Need to find the errors (bugs) in shell script and correct the errors (remove errors - debug).

Use -v and -x option with sh or bash command to debug the shell script.

General syntax is as follows:Syntax:sh   option   { shell-script-name }ORbash   option   { shell-script-name }

Option can be-v Print shell input lines as they are read.-x After expanding each simple-command, bash displays the expanded value of PS4 system variable, followed by the command and its expanded arguments

Page 49: Shell Scripting

#!/bin/shtot=`expr $1 + $2`echo $tot

run it as$ chmod 755 dsh1.sh$ ./dsh1.sh 4 59$ sh -x dsh1.sh 4 5

# Script to show debug of shelltot=`expr $1 + $2`expr $1 + $2++ expr 4 + 5+ tot=9echo $tot+ echo 99

See the above output, -x shows the exact values of variables

Page 50: Shell Scripting

Functions

Function is series of instruction/commands. Function performs particular activity in shell i.e. it had specific work to do or simply say task. To define function use following syntax

Syntax:function-name ( ) { command1 command2 ..... ... commandN return }

$ SayHello(){   echo "Hello $LOGNAME, Have a nice day”   return}

To execute this SayHello() function just type it name as follows:$ SayHelloHello Aparna, Have a nice day.

Page 51: Shell Scripting

After restarting your computer you will loss this SayHello() function, since its created for current session only.

To overcome this problem ,add your function to /etc/bashrc file.

To add function to this file you must logon as root. Following is the sample /etc/bashrc file with SayHello()

function , which is used to print formatted date. First logon as root or if you already logon with your name,

and want to move to root account, then use following command

$ su Open file /etc/bashrc using vi and goto the end of file (by

pressing shift+G) and type the SayHello() function:

Page 52: Shell Scripting

Functions are normally defined on the command line or within a script

# vi /etc/bashrc

SayHello(){   echo "Hello $LOGNAME, Have a nice day”   return}

Function Chaining:It is the process of calling a function from another function

#!/bin/bashorange () { echo "Now in orange" apple }apple () { echo "Now in apple" } orange

Page 53: Shell Scripting

Unsetting Functions

Once a function has been defined, it can be undefined via the unset command:

Syntax: unset name Here, name is the name of the function you

want to unset. For example, the following command unsets

the previously defined function SayHello(): unset SayHello After a function has been unset it cannot be

executed

Page 54: Shell Scripting

Alias

An alias is an abbreviation or an alternative name, usually mnemonic, for a command.

Aliases are defined using the alias command:Syntax: alias name="cmd" Ex: alias lsl="ls –l" Unalias : Once an alias has been defined, it

can be unset using the unalias command:Syntax: unalias name Here, name is the name of the alias to be

unset. Ex unalias lsl

Page 55: Shell Scripting

Alias vs function

Aliases are similar to functions in that they associate a command with a name. Two key differences are

1. In an alias, cmd cannot be a compound command or a list.

2. In an alias, there is no way to manipulate the argument list ($@).

Due to their limited capabilities, aliases are not commonly used in shell programs.

Page 56: Shell Scripting

1. Operators - >, <, >>, >&, |2. File Redirection

command >file command <filecommand 2> file

BASH Features: I/O Redirection

Page 57: Shell Scripting

Environmentenv variables - $HOME, $PWD, $LOGNAMEAliases - alias cp='cp -i'Use ~/.bashrc to set env variables and aliases

Job ControlForeground and Background jobs (&)Ctrl-z, bg, fg, jobskill %job

BASH Features

Page 58: Shell Scripting

Quoting Escape character (\)

# echo \$hello $hello

Partial quoting ("...")Escape special characters using \Prevents word-splitting

Full quoting ('...')Cannot use escape sequencesCannot embed single quotes

BASH Features

Page 59: Shell Scripting

Other Shell-scripting tools Basic commands

ls, cat ,cp, mv, find, xargs, exprdate, time, etc

Filtersgrep, sort, uniq, diff, cut, paste, etc.Regular Expressions

Other programssed, awk, lex, yacctty, stty, tset

Page 60: Shell Scripting

Regular Expressions

Pattern matching rules

Used in grep, sed, awk

Basic reg. exps

,^ ,$, *, ?, +, [^...]

Page 61: Shell Scripting

Other Shell-scripting tools Sed Search and Replace Delete

Awk Search and process patterns Process input streams

Page 62: Shell Scripting

Usage of Shell-scripts

Where to use shell-scriptingSystem Administration

-Automate tasks-Repeated tasks

Development-Allows testing a limited sub-set of functionality-Testing tools

Daily usageSimple scripts

- reminders, diary, mail, etc.

Page 63: Shell Scripting

Where Not to use shell-scripting

Resource-intensive tasks

Cross-platform portability (Use C, JAVA,etc.)

Complex and mission-critical applications

Where security is important

Proprietary, closed-source applications

Usage of Shell-scripts

Page 64: Shell Scripting

Optimising scripts

Speed improvement

Use/write programs for slow operations

e.g: use grep to speeden searches and awk for mathematical ops

Optimise loops

Minimise I/O : BASH is slow with files

Use awk, Perl, etc. where speed is reqd.

Keeping scripts small

Modularised scripting

Page 65: Shell Scripting

Script to reverse given no

if [ $# -ne 1 ] then echo "Usage: $0 number" echo " For eg. $0 123, I will print 321" exit 1 fi n=$1 ;rev=0 ; sd=0 while [ $n -gt 0 ] do sd=`expr $n % 10` rev=`expr $rev \* 10 + $sd` #echo -n $sd n=`expr $n / 10` done echo "Reverse number is $rev"

Page 66: Shell Scripting

Write script to print given numbers sum of all digit

if [ $# -ne 1 ] ; then echo "Usage: $0 number" echo " For eg. $0 123, I will print 6 as sum of all digit (1+2+3)" exit 1 fi n=$1; sum=0 ;sd=0 while [ $n -gt 0 ] do sd=`expr $n % 10` sum=`expr $sum + $sd` n=`expr $n / 10` done echo "Sum of digit for number is $sum"

Page 67: Shell Scripting

System date wise msg

temph=`date | cut -c12-13` dat=`date +"%A %d in %B of %Y (%r)"` if [ $temph -lt 12 ]; then mess="Good Morning $LOGNAME, Have nice day!“ fi if [ $temph -gt 12 -a $temph -le 16 ] ;then mess="Good Afternoon $LOGNAME“ fi if [ $temph -gt 16 -a $temph -le 18 ]; then mess="Good Evening $LOGNAME“ fi

Page 68: Shell Scripting

if which dialog > /dev/null then dialog --backtitle "Linux Shell Script Tutorial"\ --title "(-: Welcome to Linux :-)"\ --infobox "\n$mess\nThis is $dat" 6 60 echo -n " Press a key to

continue. . . " read clear else echo -e "$mess\nThis is $dat" fi

Page 69: Shell Scripting

for (( i=1; i<=5; i++ ))do for (( j=1; j<=i; j++ )) do echo -n "$i" done echo “” done

Page 70: Shell Scripting

for (( i=1; i<=5; i++ )) do for (( j=1; j<=i; j++ )) do echo -n "$j” done echo “” done

Page 71: Shell Scripting

echo "Stars“ for (( i=1; i<=5; i++ )) do for (( j=1; j<=i; j++ )) do echo -n " *" done echo "" done for (( i=5; i>=1; i-- )) do for (( j=1; j<=i; j++ )) do echo -n " *" done echo "" done

Page 72: Shell Scripting

MAX_NO=0 echo -n "Enter Number between (5 to 9) : " read MAX_NO if ! [ $MAX_NO -ge 5 -a $MAX_NO -le 9 ]

; then echo "I ask to enter number between 5 and

9, Okay“ exit 1 fi clear for (( i=1; i<=MAX_NO; i++ )) do for (( s=MAX_NO; s>=i; s-- )) do echo -n " " done

Page 73: Shell Scripting

for (( j=1; j<=i; j++ )) doecho -n " $i" done echo "" done for (( i=1; i<=MAX_NO; i++ )) do for (( s=MAX_NO; s>=i; s-- )) do echo -n " " done for (( j=1; j<=i; j++ )) do echo -n " ." done echo " done “

Page 74: Shell Scripting

Script to sort n numbers in ascending orderecho “enter array size”read necho “enter array elements”for (( i = 0; i < n ; i++ ))do read nos[$i]done# Now do the Sorting of numbers -for (( i = 0; i < n ; i++ ))do for (( j = $i; j < n; j++ )) do if [ ${nos[$i]} -gt ${nos[$j]} ]; then t=${nos[$i]} nos[$i]=${nos[$j]} nos[$j]=$t

Page 75: Shell Scripting

fi done

doneecho “sorted elements”for (( i = 0; i < n ; i++ ))do echo ${nos[$i]}done

Script to sort n numbers in ascending order