read Summaryif get -o /tmp/put.a$$ $1 # previous versionthen # merge pieces cp $1 /tmp/put.b$$ # current version echo"@@@ `getname` `date` $Summary" >>/tmp/put.b$$ diff -e $1 /tmp/put.a$$ >>/tmp/put.b$$ # latest diffs sed -n '/^@@@/,$p' <$HIST >>/tmp/put.b$$ # old diffs overwrite $HIST cat /tmp/put.b$$ # put it backelse # make a new one echo "put: creating $HIST" cp $1 $HIST echo "@@@ `getname` `date` $Summary" >>$HISTfirm -f /tmp/put.[ab]$$После считывания одной строки сводки команда
putget-оgetgetputthen@@@overwriteКоманда
getput# get: extract file from historyPATH=/bin:/usr/binVERSION=0while test "$1" != ""do case "$1" in -i) INPUT=$2; shift ;; -o) OUTPUT=$2; shift ;; -[0-9]) VERSION=$1 ;; -*) echo "get: Unknown argument $i" 1>&2; exit 1 ;; *) case "$OUTPUT" in "") OUTPUT=$1 ;; *) INPUT=$1.H ;; esac esac shiftdoneOUTPUT=${OUTPUT?"Usage: get [-o outfile] [-i file.H] file"}INPUT=${INPUT-$OUTPUT.H}test -r $INPUT || { echo "get: no file $INPUT" 1>&2; exit 1; }trap 'rm -f /tmp/get.[ab]$$; exit 1' 1 2 15# split into current version and editing commandssed <$INPUT -n '1,/^@@@/w /tmp/get.a'$$'/^@@@/,$w /tmp/get.b'$$# perform the editsawk </tmp/get.b$$ ' <a href="">/^@@@/</a> { count++ } !/^@@@/ && count > 0 && count <= - "$VERSION" END { print "$d"; print "w", "'$OUTPUT'" }' | ed - /tmp/get.a$$rm -f /tmp/get.[ab]$$Флаги выполняют обычные функции:
-i-о-[0-9]-0-1whiletestshiftfor-i-оshiftforedСтрока
test -r $INPUT || {echo "get: no file $INPUT" 1>&2; exit 1;}эквивалентна конструкции
if test ! -r $INPUTthen echo "get: no file $INPUT" 1>&2 exit 1fi(такую конструкцию мы использовали в команде
put||{}exitget{}dodoneВ заключение мы рассмотрим те команды в
getsedawk@@@awked$d@@@sedwoverwriteget