120 likes | 213 Views
Learn the power of shell scripting with looping, functions, debugging techniques, and essential tips for efficient script development. Discover how to utilize for and while statements, manipulate positional parameters, create symbolic links, define shell functions, and debug scripts effectively.
E N D
Looping with a List: for Statement • for lets a set of instructions be repeated on a set of items in a list. • The general form is: Example: • for variablein listfor file in file1 file2 file3 • do do • commands echo $file has `wc –l` lines • done echo $file has `wc –c` chars • done • Whitespace separates items in the list. Use quotes if items have whitespace.
A for List’s Items May Come from Anywhere • for list items may come from variables or wildcards as in this example. • # This shell program renames files with • # a txt extension to files with a doc extension • # e.g., rick.txt rick.doc • for file in *.txt • do • leftname=`basename $file .txt` • mv $file ${leftname}.doc • done • Wildcards are interpreted by the shell as filenames.
Looping While a Condition Is True: while Statement • while lets a set of instructions be repeated as long as a condition is true. • The general form is: Example: • while condition is truex=5 • do while [ $x –gt 0 ] ; do • commands ps –e; sleep 3 • done x=`expr $x – 1` • done # repeats 5 times • The continue statement lets you end one iteration of the loop and start • the next iteration immediately. • The break statement lets you completely exit the loop immediately.
Try These whileExamples • Problems 1 and 2 of the In-Class Lab: • Modify program so that it continuously runs until the user • selects the exit option. • Create a shell program so that a “database” file of users • and their telephone numbers are created.
Using setto Manipulate Positional Parameters • set -- command assigns each of the items in command • a positional parameter. • Example: set -- `date` implies $1 is Mon,$2 is Nov, $3 is 10, $4 • is09:40:35 , $5 is EST, and $6 is 2010. • Let’s write a shell script, mydate.sh, that takes outputs the date in • the format: • Today is Mon, the 28th day of the month of Nov in 2011.
Try this example: mytime.sh • Write a shell program, mytime.sh, that displays the time in the format: • The time is 15 minutes past the hour of 10. • Hints: • 1. Grab the time from the date command positional parameter. • 2. Save the time in a file. • 3. Use the cut command to get the hours and minutes of the time. • 4. Format the time as above using the hours and minutes.
Using shiftto Manipulate Positional Parameters • shift n transfers the contents of each positional parameter to • its immediate lower numbered one. If a number n is • present, this is done n times. • Example: set -- `date` implies $1 is Mon,$2 is Nov, $3 is 10, $4 • is09:40:35 , $5 is EST, and $6 is 2010. • shift • echo $1 $2 $3 displays$1asNov,$2as10 and $3 as • 09:40:34
myln.sh • #!/bin/sh • # This program creates multiple symbolic links to a • # single target. Usage: myln.sh target list of files • # • original=$1 # target file • [ ! –f $original] && { echo “$original not found” ; • exit 1 ; } • shift # left-most argument (target) is lost • for file in $* ; do • ln –sf $original $file • done
An Alternative to alias: Shell Functions • Shell functions execute a group of statements enclosed within {} • General form: • functionName() { # always a null parameter list • statements • return value# optional number, indicating • } # success or failure • Example: ls –l files | more myls() { • > ls –l $* | more • > } • myls *.c
Debugging Shell Scripts • set can be used to produce debugging output: • set -overbose • set –o xtrace • verboseEchoes each command before running them to stderr • xtraceEchoes each command after command-line processing, after parameter and command substitution, and the other subsequent steps. • Each line it prints starts with + which is customizable through the built-in shell variable PS4. So you can set PS4 to "xtrace-> "
Some Final Tips • To use the output of a UNIX command elsewhere in script, type a $, enclose the command within parentheses (), and store the output in an environment variable, e.g., VAR1=$(command1|command2) • To use a value of an environment variable, put a $ in front of the variable name and to avoid ambiguities, enclose the variable name inside curly braces {}, e.g., ls ${VAR1} • See the text for more useful topics: trap, eval, exec, awk, sed • we didn’t cover in class.