680 likes | 703 Views
Midterm Solutions. Stats. Average: 62.7 Median: 64.5 Std dev: 16.1 Range: 18-98 >=80: 10 A 70-80: 19 B+/A- 60-70: 22 B/B+ 50-60: 10 B-/B 40-50: 12 C/B- <40: 6. HW1. Average: 88 Median: 64.5 Std dev: 11.2 Range: 53-100. Question 1. a, c, e a, c, d, e. Question 2.
E N D
Stats • Average: 62.7 • Median: 64.5 • Std dev: 16.1 • Range: 18-98 • >=80: 10 A • 70-80: 19 B+/A- • 60-70: 22 B/B+ • 50-60: 10 B-/B • 40-50: 12 C/B- • <40: 6
HW1 • Average: 88 • Median: 64.5 • Std dev: 11.2 • Range: 53-100
Question 1 • a, c, e • a, c, d, e
Question 2 • 1: file1 • 1: file2 2: > 3: file1 • 1: file1 2: > file2 • 1: echo file1 • 1: file1 • 1: file1 2: file2 • 1: file1 2: file2
Question 3 • xxxx:--xx[-N][-][[+][.][B]][...][-N][-][[+][.][B]][...]
Question 3 (cont.) • zusage: od file ...]Total 11 records • $ odod: illegal optionusage: odDone!
Question 4 • find ~ ! -type d -perm -001 -mtime +10 \ \( -name “*.xml” -o -name “*.html” \)
Question 5 • cut -d, -f4 | grep -c ‘^A$’ • egrep ‘,MSCS,(D|F),(D|F)$’ |\ cut -d, -f1 • grep ‘,\([^,]*\),\1$’ | cut -d,\ -f2 | cut -c6- • cut -d’ ‘ -f1 | sort | uniq |\ tr ‘a-z’ ‘A-Z’ • grep -v ‘^[^,]*,[^,]*,MSIS,’ |\ grep -c ‘T[^ ]* B[^ ]*’
Question 6 { lines[$0]=1 for (i=1; i<=NF; i++) { words[$i]=1 } } END { for (l in lines) { nl++ } for (w in words) { nw++ } printf("There are %d words and %d lines.\n", nw, nl) }
Question 7 • awk -F, ‘{print NF}’ • tr -cd ‘,\n’ | wc -c
Question 8 #!/bin/sh if [ $# -lt 2 ] ; then exit 1 fi DELIM="$1" shift fileprinted=0 for file in "$@" ; do samecol=1 nfield=-1 while read line ; do num=`echo $line | \ awk -F"$DELIM" '{print NF}'`
if [ $nfield -eq -1 ] ; then nfield=$num elif [ $num -ne $nfield ] ; then samecol=0 break fi done < $file if [ $samecol -eq 1 ] ; then echo $file fileprinted=1 fi done if [ $fileprinted -eq 1 ] ; then exit 0 else exit 1 fi
Lecture 10 Shell (cont) UNIX Development Tools
Command Substitution • Better syntax with $(command) • Allows nesting • x=$(cat $(generate_file_list)) • Backward compatible with ` … ` notation
Expressions • Expressions are built-in with the [[ ]] operator if [[ $var = "" ]] … • Gets around parsing quirks of /bin/test, allows checking strings against patterns • Operations: • string==pattern • string!=pattern • string1<string2 • file1–ntfile2 • file1–otfile2 • file1–effile2 • &&, ||
Patterns • Can be used to do string matching: if [[ $foo = *a* ]] if [[ $foo = [abc]* ]] • Note: patterns are like a subset of regular expressions, but different syntax
Additonal Parameter Expansion • ${#param} – Length of param • ${param#pattern} – Left strip min pattern • ${param##pattern} – Left strip max pattern • ${param%pattern} – Right strip min pattern • ${param%%pattern} – Right strip max pattern • ${param-value} – Default value if param not set
Variables • Variables can be arrays • foo[3]=test • echo ${foo[3]} • Indexed by number • ${#arr} is length of the array • Multiple array elements can be set at once: • set –A foo a b c d • echo ${foo[1]} • Set command can also be used for positional params: set a b c d; print $2
Functions • Alternative function syntax: function name { commands} • Allows for local variables • $0 is set to the name of the function
Additional Features • Built-in arithmetic: Using $((expression )) • e.g., print $(( 1 + 1 * 8 / x )) • Tilde file expansion ~ $HOME ~user home directory of user ~+ $PWD ~- $OLDPWD
Variable Attributes • By default attributes hold strings of unlimited length • Attributes can be set with typeset: • readonly (-r) – cannot be changed • export (-x) – value will be exported to env • upper (-u) – letters will be converted to upper case • lower (-l) – letters will be converted to lower case • ljust (-L width) – left justify to given width • rjust (-R width) – right justify to given width • zfill (-Z width) – justify, fill with leading zeros • integer (-I [base]) – value stored as integer • float (-E [prec]) – value stored as C double • nameref (-n) – a name reference
Name References • A name reference is a type of variable that references another variable. • nameref is an alias for typeset -n • Example: user1="jeff"user2="adam"typeset –n name="user1"print $namejeff
New Parameter Expansion • ${param/pattern/str} – Replace first pattern with str • ${param//pattern/str} – Replace all patterns with str • ${param:offset:len} – Substring with offset
Patterns Extended Regular Expressions Patterns • Additional pattern types so that shell patterns are equally expressive as regular expressions • Used for: • file expansion • [[ ]] • case statements • parameter expansion
ANSI C Quoting • $'…' Uses C escape sequences $'\t' $'Hello\nthere' • printf added that supports C like printing: printf "You have %d apples" $x • Extensions • %b – ANSI escape sequences • %q – Quote argument for reinput • \E – Escape character (033) • %P – convert ERE to shell pattern • %H – convert using HTML conventions • %T – date conversions using date formats
Associative Arrays • Arrays can be indexed by string • Declared with typeset –A • Set: name["foo"]="bar" • Reference ${name["foo"]} • Subscripts: ${!name[@]}
Types of Development Tools • Compilation and building: make • Managing files: RCS, SCCS, CVS • Editors: vi, emacs • Archiving: tar, cpio, pax, RPM • Configuration: autoconf • Debugging: gdb, dbx, prof, strace, purify • Programming tools: yacc, lex, lint, indent
Make • make: A program for building and maintaining computer programs • developed at Bell Labs around 1978 by S. Feldman (now at IBM) • Instructions stored in a special format file called a “makefile”.
Make Features • Contains the build instructions for a project • Automatically updates files based on a series of dependency rules • Supports multiple configurations for a project • Only re-compiles necessary files after a change (conditional compilation) • Major time-saver for large projects • Uses timestamps of the intermediate files • Typical usage: executable is updated from object files which are in turn compiled from source files
Dependency Graph myprog link foo.o bar.o baz.o compile foo.c bar.c baz.c baz.y original generated
Makefile Format • Rule Syntax: <target>: <dependency list> <command> • The <target> is a list of files that the command will generate • The <dependency list> may be files and/or other targets, and will be used to create the target • It must be a tab before <command>, or it won’t work • The first rule is the default <target> for make
Examples of Invoking Make • make -f makefile • make target • make • looks for file makefile or Makefile in current directory, picks first target listed in the makefile
Make: Sequence of Execution • Make executes all commands associated with target in makefile if one of these conditions is satisfied: • file target does not exist • file target exists but one of the source files in the dependency list has been modified more recently than target
Example Makefile # Example Makefile CC=g++ CFLAGS=-g –Wall -DDEBUG foobar: foo.o bar.o $(CC) $(CFLAGS) –o foobar foo.o bar.o foo.o: foo.cpp foo.h $(CC) $(CFLAGS) –c foo.cpp bar.o: bar.cpp bar.h $(CC) $(CFLAGS) –c bar.cpp clean: rm foo.o bar.o foobar
Make Power Features • Many built-in rules • e.g. C compilation • “Fake” targets • Targets that are not actually files • Can do just about anything, not just compile • Like the “clean” target • Forcing re-compiles • touch the required files • touch the Makefile to rebuild everything
Version Control • Provide the ability to store/access and protect all of the versions of source code files • Provides the following benefits: • If program has multiple versions, it keeps track only of differences between multiple versions. • Multi-user support. Allows only one person at the time to do the editing. • Provides a way to look at the history of program development.
Version Control Systems • SCCS: UNIX Source Code Control System • Rochkind, Bell Labs, 1972. • RCS: Revision Control System • Tichy, Purdue, 1980s. • CVS: Concurrent Versions System • Grune, 1986, Berliner, 1989.
RCS Basic Operations • Set up a directory for RCS: • mkdir RCS • Check in a new file into the repository • ci filename • Check out a file from the repository for reading • co filename • Check out a file from the repository for writing • co –l filename • Acquires lock • Compare local copy of file to version in repository • rcsdiff [–r<ID>] filename
RCS Keywords • Keywords in source files are expanded to contain RCS info at checkout • $keyword$ $keyword: value $ • Use ident to extract RCS keyword info • $Author$ Username of person checked in the revision • $Date$ Date and time of check-in • $Id$ A title that includes the RCS filename, revision number, date, author, state, and (if locked) the person who locked the file • $Revision$ The revision number assigned
SCCS Equivalents Function RCS SCCS Setup mkdir RCS mkdir SCCS Check in new foo.c ci foo.c sccs create foo.c Check in update to foo.c ci foo.c sccs delta foo.c Get read-only foo.c co foo.c sccs get foo.c Get writeable foo.c co -l foo.c sccs edit foo.c Version history of foo.c rlog foo.c sccs print foo.c Compare foo.c to v1.1 rcsdiff sccs diffs –r1.1 foo.c -r1.1 foo.c
CVS Major Features • No exclusive locks like RCS • No waiting around for other developers • No hurrying to make changes while others wait • Avoid the “lost update” problem • Client/Server model • Distributed software development • Front-end tool for RCS with more functions
CVS Repositories • All revisions of a file in the project are in the repository (using RCS) • Work is done on the checkout (working copy) • Top-level directories are modules; checkout operates on modules • Different ways to connect
CVSROOT • Environment Variable • Location of Repository • Can take different forms: • Local file system: /usr/local/cvsroot • Remote Shell: user@server:/usr/local/cvsroot • Client/Server: :pserver:user@server:/usr/local/cvsroot
Getting Started • cvs [basic-options] <command> [cmd-options] [files] • Basic options: • -d <cvsroot> Specifies CVSROOT • -H Help on command • -n Dry run • Commands • import, checkout • update, commit • add, remove • status, diff, log • tag...
Setting up CVS • Importing source • Generates a new module • cd into source directory • cvs –d<cvsroot> import <new-module> <vendor-branch> <release-tag> • cvs –d<cvsroot> checkout <module-name>
Managing files • Add files: add (cvs add <filename>) • Remove files: remove (cvs remove <filename>) • Get latest version from repository: update • If out of sync, merges changes. Conflict resolution is manual. • Put changed version into repository: commit • Fails if repository has newer version (need update first) • View extra info: status, diff, log • Can handle binary files (no merging or diffs) • Specify a symbolic tag for files in the repository: tag