unix-21 week 2 4/5/2005. unix-22 topics functions (contd.) pushd, popd, dirs debugging shell...
DESCRIPTION
UNIX-23 Sample Files Download states.txt and statecap.txt from acelinux.tripod.comTRANSCRIPT
UNIX-2 1
WEEK 2
4/5/2005
UNIX-2 2
TOPICS
• Functions (contd.)• pushd, popd, dirs• Debugging Shell scripts• Scheduling Unix jobs• Job Management
UNIX-2 3
Sample Files
• Download states.txt and statecap.txt from acelinux.tripod.com
UNIX-2 4
cut• Used to extract fields from a line• By defaults, fields are delimited by tab• Syntax: cut –d <delimiter> -f <fields>• e.g. cut –d ‘:’ –f1 /etc/passwd displays 1st
column of file /etc/passwd cut –d ‘:’ –f2 /etc/passwd displays 2nd
column of file /etc/passwd
UNIX-2 5
cut (contd.)more /etc/passwdcut –d’:’ -f1 /etc/passwd > usernamesmore usernames
cut –d’:’ –f1-3 /etc/passwdcut –d’ ‘ –f2 statecap.txtcut –d’ ‘ –f2 statecap.txt > capcities
UNIX-2 6
Examples of cut
UNIX-2 7
Exercise• Write a shell script that displays the
current date and time on separate lines`
UNIX-2 8
dt=`date`day=`echo $dt | cut –d’ ‘ –f1`echo Day is $daymnth=`echo $dt | cut –d’ ‘ –f2`echo Month is $mnthdte=`echo $dt | cut –d’ ‘ –f3`echo date is $dtetme=`echo $dt | cut –d’ ‘ –f4`echo time is $tmeyr=`echo $dt | cut –d’ ‘ –f6’echo year is $yr
UNIX-2 9
day=`date | cut –d’ ‘ –f1`echo Day is $daymnth=`date | cut –d’ ‘ –f2`echo Month is $mnthdte=`date | cut –d’ ‘ –f3`echo date is $dtetme=`date | cut –d’ ‘ –f4`echo time is $tmeyr=`date | cut –d’ ‘ –f6’echo year is $yr
UNIX-2 10
paste
• Command to combine files.• By default, adds a space between fields• e.g. paste /etc/passwd /etc/passwd paste –d “X” /etc/passwd /etc/passwd
UNIX-2 11
paste - examples
more states.txt paste states.txt states.txt > 2states.txtmore 2states.txt
paste states.txt /etc/passwd > junkmore junk
UNIX-2 12
wc• wc – word count• Displays the number of lines, words and
characters in the file(s)• Syntax: wc filenamee.g wc states.txt
UNIX-2 13
wc Options
• wc –l states.txtdisplays # of lines
• wc -m /etc/passwd displays # of characters
• wc –w states.txtdisplays # of words
UNIX-2 14
grep bash /etc/passwd | wc –l # displays # of
users with bash as default shell
grep csh /etc/passwd | wc –l # displays # of
users with csh as default shell
UNIX-2 15
export• Used to make variables available to all
child shell processes• By default, shell variables are available
only the shell that they are defined in• To make shell variables available in
child shell processes, they have to be “exported”
UNIX-2 16
mainscriptA in childscript is
echo A in childscript is $A
A=apple # define a variable Achildscript # call another script. This script
# executes in a child shell process
mainscript
childscript
UNIX-2 17
mainscriptA in childscript is apple
echo A in childscript is $A
export A=apple # define a variable Achildscript # call another script. This script
# executes in a child shell process
mainscript
childscript
UNIX-2 18
source, . (dot command)
• source, . are used to execute scripts in the same shell
• . (dot) is more portable than source i.e. available on almost all versions of all shells
• Can be used from command line or from inside a script
UNIX-2 19
. (cmd-line)
• When invoked on command line, executes the script
. myscript Executes myscript in the current shell
UNIX-2 20
county=fairfaxmyscript
myscript
. myscript or source myscript
echo $county
fairfaxecho $county
UNIX-2 21
export city=centrevillemyscript2
myscript2
./myscript2
echo $city
echo $city
UNIX-2 22
echo Setting county variablecounty=fairfax
myscript
myscript
. myscript or source myscript
echo $county
fairfaxecho $countySetting county variable
Setting county variable
UNIX-2 23
. (within script)
• When used within a script, . executes the called script in the same shell as the main script
• Same effect as if “sourced” script was imported into the main script
UNIX-2 24
echo Setting county variablecounty=montgomery
myscript
echo executing myscriptmyscriptecho Value of county is $county
mymainscript
mymainscriptexecuting myscriptSetting county variable
Value of county is
UNIX-2 25
echo Setting county variablecounty=montgomery
myscript
echo executing myscript. myscriptecho Value of county is $county
mymainscript
mymainscriptexecuting myscriptSetting county variable
Value of county is montgomery
UNIX-2 26
Importing functions
• Functions can be imported into a script using the . command
• Once imported, functions can be used in script as if they were defined in the script.
• Need to import the complete function file• Functions are NOT executed when imported
– only when “called”
UNIX-2 27
sum_fn(){ let result=$1+$2 return $result}diff_fn(){ let result=$1-$2 return $result}
funfile
UNIX-2 28
. funfilesum_fn $1 $2echo sum of $1 and $2 is $?diff_fn $1 $2echo difference of $1 and $2 is $?
mathscript
mathscript 10 30sum of 10 and 30 is 40difference of 10 and 30 is -20
UNIX-2 29
Exercise
• Rewrite the calculator script by writing all the functions in a single file and “importing” that file into the main script
UNIX-2 30
pushd, popd, dirs• Set of commands to “bookmark” working
directories• Traverse directories in order• First In Last Out• pushd dir-name pushes dir-name to
directory stack and changes current directory to dir-name
• popdremoves top directory in stack and changes current dir to the dir popped from stack
UNIX-2 31
pushd, popd, dirs
• dirs lists contents of directory stack• pushd, popd commands also list
contents of directory stack• Used in scripts that require changes to
current-working directory without hard-coding directory name
UNIX-2 32
pushd - examplespushd /tmppwdpushd /usrpwddirspushd /binpwddirs
UNIX-2 33
popd - examplespwdpopddirspwdpopdpwddirspopdpwd
UNIX-2 34
pushd, popd in scripts# scriptpushd somedirectory# we are now in somedirectory…popd# back in original directory…
UNIX-2 35
Shell Debugging
• No debugger nor any debugging commands/constructs
• Cryptic error messages• Use bash options for primitive
debugging
UNIX-2 36
Bash debugging options
-v echoes each command before executing it (before evaluating)
-n checks for syntax errors without actually executing the script (weak check)
-x print each command before executing (after evaluating)
UNIX-2 37
Debugging method-1
• Add option to bash definition in 1st line of script
#!/bin/bash –v…
UNIX-2 38
#!/bin/bash –x
echo Enter passwordread passif [ “$pass” != “magic” ]then echo Wrong passwordelse echo Correct passwordfi
UNIX-2 39
#!/bin/bash –v
echo Enter passwordread passif [ “$pass” != “magic” ]then echo Wrong passwordelse echo Correct passwordfi
UNIX-2 40
#!/bin/bash –n
echo Enter passwordread passif[ “$pass” != “magic” ]then echo Wrong passwordelse echo Correct passwordfi
UNIX-2 41
Debugging Method - 2
• Execute script in cmd-line bash with required option
• Don’t need to hard-code option inside script
$ bash –v myscript
UNIX-2 42
#!/bin/bashecho Enter passwordread passif [ “$pass” != “magic” ]then echo Wrong passwordelse echo Correct passwordfi
$ bash –v myscript
myscript
UNIX-2 43
#!/bin/bashecho Enter passwordread passif [ “$pass” != “magic” ]then echo Wrong passwordelse echo Correct passwordfi
$ bash –x myscript
myscript
UNIX-2 44
#!/bin/bashecho Enter passwordread passif[ “$pass” != “magic” ]then echo Wrong passwordelse echo Correct passwordfi
$ bash –n myscript
myscript
UNIX-2 45
Downloading bash 3.0
Create a temporary directory /tmp/bash mkdir /tmp/bashGo to: http://ftp.gnu.org/gnu/bash/File: bash-3.0-tar.gzDownload file to /tmp/bash
UNIX-2 46
Downloading bash-3.0 (contd.)
cd /tmp/bash cd to directorygunzip bash-3.0.tar.gz Unzip filetar –xvf bash-3.0.tar Un-tar the filecd bash-3.0./configure Run configure scriptmake Run make utility to Build bash binary
ls –l bash Verify bash was built successfullycp bash ~ Copy bash binary to home dir
UNIX-2 47
read (re-visited v3.0+)
• read command can be used to read multiple variables
• -s do not echo input• -n N accept only N chars of input• -p string echo string as prompt before
reading input
UNIX-2 48
read –s –n 6 –p “Enter password” pass accepts 6 char input, does not echo
keystrokes and prompt is “Enter password”
read –p “Enter 2 numbers” x y
accepts 2 values into x and y. If less values are passed, remaining variables are not set
UNIX-2 49
#!/home/acestudent7/bash
read –s –n 6 –p “Enter password” pass
UNIX-2 50
Exercise• Write a script that prompts the user to create
a new 6 character password. • The user must be prompted to reconfirm the
new password. • A success message must be displayed if the
user re-enters the password correctly else a failure message must be displayed.
• The password must not be echoed on the screen.
UNIX-2 51
Enter 6 char passwordRe-enter passwordPassword entered successfully
Enter 6 char passwordRe-enter passwordPasswords do not match
Sample execution of script
UNIX-2 52
dt=`date`day=`echo $dt | cut –d’ ‘ –f1`mnth=`echo $dt | cut –d’ ‘ –f2`dte=`echo $dt | cut –d’ ‘ –f3`tme=`echo $dt | cut –d’ ‘ –f4`yr=`echo $dt | cut –d’ ‘ –f6’bkupdir=/tmp/backup_$day_$month_$tme_yrmkdir $bkupdircp –R ~ $bkupdir
UNIX-2 53
Exercise
• Write a shell script that does the following:
• Creates a directory called backup_<timestamp> in the /tmp/directory
• Copies all files and directories in your home directory to the new directory
UNIX-2 54
Scheduling Jobs - cron
• cron – utility used to execute commands at specified times/dates
• Output/error of commands is e-mailed to user
• Commands are executed with privileges of user who setup the cron-job
UNIX-2 55
crontab
• Command to schedule jobs• Each input line corresponds to a job• Each input line must contain 6 space
separated fields• 1-5 date/time• 6 – command to be executed
UNIX-2 56
crontab options• -l list user’s crontab tasks• -r remove all of user’s crontab tasks• -e edit user’s crontab file
UNIX-2 57
crontab time/date fields1. Minute (0 – 59)2. Hour (0 – 23)3. Day-of-month (1 – 31)4. Month-of-year (1 – 12)5. Day-of-week (0 – 6) (0=Sunday) * all valid valuesComma-separated values Specify range using hyphen6. Command to be executed
UNIX-2 58
crontab - examples00 05 * * 1,2,3,4,5 script1 arg1 5am M-
F45 06 * * 5 somescript 6:45am every Fri00 01 1 * * myscript 1am 1st of every
month
UNIX-2 59
crontab – setting up jobs
crontab* * * * * /home/acestudent7/mybackupscriptCtrl-d
UNIX-2 60
crontab – setting up jobs (contd.)
• crontab – e allows to setup jobs in a editor
• EDITOR variable must be set to a valid editor
• export EDITOR=gedit
UNIX-2 61
crontab – viewing jobs
• crontab –l displays current job list
UNIX-2 62
jobs
• List jobs running in the background
sleep 1000 &jobs
kill %1 stops the first jobkill 1932 stops job with id 1932
UNIX-2 63
wait• Stops script execution until all jobs
running in background have terminated• Or until job with number specified
terminates
…wait 200 # wait till job with process id 200 terminates
…
UNIX-2 64
$!
• Process id of last back-ground process
find / -name core –print 2> /tmp/err > out &pid=$!…
wait $pidmail user < out
UNIX-2 65
Next Week
• Application Development Procedures • Compilers and GNU development tools• Version control demo