From 387372f7317714b3ab2923faafff740a499cd4b3 Mon Sep 17 00:00:00 2001 From: gferg <> Date: Mon, 3 Jun 2002 14:36:49 +0000 Subject: [PATCH] new --- LDP/guide/docbook/abs-guide/badread.sh | 32 ++++++ LDP/guide/docbook/abs-guide/commentblock.sh | 30 ++++++ LDP/guide/docbook/abs-guide/ex33a.sh | 45 ++++++++ LDP/guide/docbook/abs-guide/file-integrity.sh | 102 ++++++++++++++++++ LDP/guide/docbook/abs-guide/here-function.sh | 32 ++++++ LDP/guide/docbook/abs-guide/makedict.sh | 41 +++++++ LDP/guide/docbook/abs-guide/pb.sh | 47 ++++++++ LDP/guide/docbook/abs-guide/read-novar.sh | 24 +++++ .../docbook/abs-guide/reassign-stdout.sh | 37 +++++++ LDP/guide/docbook/abs-guide/self-destruct.sh | 10 ++ LDP/guide/docbook/abs-guide/self-document.sh | 33 ++++++ LDP/guide/docbook/abs-guide/self-exec.sh | 19 ++++ LDP/guide/docbook/abs-guide/set-pos.sh | 37 +++++++ LDP/guide/docbook/abs-guide/upperconv.sh | 44 ++++++++ 14 files changed, 533 insertions(+) create mode 100644 LDP/guide/docbook/abs-guide/badread.sh create mode 100644 LDP/guide/docbook/abs-guide/commentblock.sh create mode 100644 LDP/guide/docbook/abs-guide/ex33a.sh create mode 100644 LDP/guide/docbook/abs-guide/file-integrity.sh create mode 100644 LDP/guide/docbook/abs-guide/here-function.sh create mode 100644 LDP/guide/docbook/abs-guide/makedict.sh create mode 100644 LDP/guide/docbook/abs-guide/pb.sh create mode 100644 LDP/guide/docbook/abs-guide/read-novar.sh create mode 100644 LDP/guide/docbook/abs-guide/reassign-stdout.sh create mode 100644 LDP/guide/docbook/abs-guide/self-destruct.sh create mode 100644 LDP/guide/docbook/abs-guide/self-document.sh create mode 100644 LDP/guide/docbook/abs-guide/self-exec.sh create mode 100644 LDP/guide/docbook/abs-guide/set-pos.sh create mode 100644 LDP/guide/docbook/abs-guide/upperconv.sh diff --git a/LDP/guide/docbook/abs-guide/badread.sh b/LDP/guide/docbook/abs-guide/badread.sh new file mode 100644 index 00000000..bd1ca131 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/badread.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# badread.sh: +# Attempting to use 'read' +#+ to assign variables non-interactively. + +a=aaa +b=bbb +c=ccc + +echo "one two three" | read a b c +# Try to reassign a, b, and c. + +echo "a = $a" # a = aaa +echo "b = $b" # b = bbb +echo "c = $c" # c = ccc +# Reassignment failed. + +# ------------------------------ + +# Try the following alternative. + +var=`echo "one two three"` +set -- $var +a=$1; b=$2; c=$3 + +echo "-------" +echo "a = $a" # a = one +echo "b = $b" # b = two +echo "c = $c" # c = three +# Reassignment succeeded. + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/commentblock.sh b/LDP/guide/docbook/abs-guide/commentblock.sh new file mode 100644 index 00000000..1ba4c5d3 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/commentblock.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# commentblock.sh + +: << COMMENTBLOCK +echo "This line will not echo." +This is a comment line missing the "#" prefix. +This is another comment line missing the "#" prefix. + +&*@!!++= +The above line will cause no error message, +because the Bash interpreter will ignore it. +COMMENTBLOCK + +echo "Exit value of above \"COMMENTBLOCK\" is $?." # 0 +# No error shown. + + +# The above technique also comes in useful for commenting out +#+ a block of working code for debugging purposes. +# This saves having to put a "#" at the beginning of each line, +#+ then having to go back and delete each "#" later. + +: << DEBUGXXX +for file in * +do + cat "$file" +done +DEBUGXXX + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/ex33a.sh b/LDP/guide/docbook/abs-guide/ex33a.sh new file mode 100644 index 00000000..276723ad --- /dev/null +++ b/LDP/guide/docbook/abs-guide/ex33a.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +# Try the following when invoking this script. +# sh ex33a -a +# sh ex33a -abc +# sh ex33a -a -b -c +# sh ex33a -d +# sh ex33a -dXYZ +# sh ex33a -d XYZ +# sh ex33a -abcd +# sh ex33a -abcdZ +# sh ex33a -z +# sh ex33a a +# Explain the results of each of the above. + +E_OPTERR=65 + +if [ "$#" -eq 0 ] +then # Script needs at least one command-line argument. + echo "Usage $0 -[options a,b,c]" + exit $E_OPTERR +fi + +set -- `getopt "abcd:" "$@"` +# Sets positional parameters to command-line arguments. +# What happens if you use "$*" instead of "$@"? + +while [ ! -z "$1" ] +do + case "$1" in + -a) echo "Option \"a\"";; + -b) echo "Option \"b\"";; + -c) echo "Option \"c\"";; + -d) echo "Option \"d\" $2";; + *) break;; + esac + + shift +done + +# It is better to use the 'getopts' builtin in a script, +#+ rather than 'getopt'. +# See "ex33.sh". + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/file-integrity.sh b/LDP/guide/docbook/abs-guide/file-integrity.sh new file mode 100644 index 00000000..d2dc30b4 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/file-integrity.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# file-integrity.sh: Checking whether files in a given directory +# have been tampered with. + +E_DIR_NOMATCH=70 +E_BAD_DBFILE=71 + +dbfile=File_record.md5 +# Filename for storing records. + + +set_up_database () +{ + echo ""$directory"" > "$dbfile" + # Write directory name to first line of file. + md5sum "$directory"/* >> "$dbfile" + # Append md5 checksums and filenames. +} + +check_database () +{ + local n=0 + local filename + local checksum + + # ------------------------------------------- # + # This file check should be unnecessary, + #+ but better safe than sorry. + + if [ ! -r "$dbfile" ] + then + echo "Unable to read checksum database file!" + exit $E_BAD_DBFILE + fi + # ------------------------------------------- # + + while read record[n] + do + + directory_checked="${record[0]}" + if [ "$directory_checked" != "$directory" ] + then + echo "Directories do not match up!" + # Tried to use file for a different directory. + exit $E_DIR_NOMATCH + fi + + if [ "$n" -gt 0 ] # Not directory name. + then + filename[n]=$( echo ${record[$n]} | awk '{ print $2 }' ) + # md5sum writes records backwards, + #+ checksum first, then filename. + checksum[n]=$( md5sum "${filename[n]}" ) + + if [ "${record[n]}" = "${checksum[n]}" ] + then + echo "${filename[n]} unchanged." + else + echo "${filename[n]} : CHECKSUM ERROR!" + # File has been changed since last checked. + fi + + fi + + + let "n+=1" + done <"$dbfile" # Read from checksum database file. + +} + +# =================================================== # +# main () + +if [ -z "$1" ] +then + directory="$PWD" # If not specified, +else #+ use current working directory. + directory="$1" +fi + +clear # Clear screen. + +# ------------------------------------------------------------------ # + if [ ! -r "$dbfile" ] # Need to create database file? + then + echo "Setting up database file, \""$directory"/"$dbfile"\"."; echo + set_up_database + fi +# ------------------------------------------------------------------ # + +check_database # Do the actual work. + +echo + +# You may wish to redirect the stdout of this script to a file, +#+ especially if the directory checked has many files in it. + +# For a much more thorough file integrity check, +#+ consider the "Tripwire" package, +#+ http://sourceforge.net/projects/tripwire/. + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/here-function.sh b/LDP/guide/docbook/abs-guide/here-function.sh new file mode 100644 index 00000000..23924d1c --- /dev/null +++ b/LDP/guide/docbook/abs-guide/here-function.sh @@ -0,0 +1,32 @@ +#!/bin/bash +# here-function.sh + +GetPersonalData () +{ + read firstname + read lastname + read address + read city + read state + read zipcode +} # This certainly looks like an interactive function, but... + + +# Supply input to the above function. +GetPersonalData <<RECORD001 +Bozo +Bozeman +2726 Nondescript Dr. +Baltimore +MD +21226 +RECORD001 + + +echo +echo "$firstname $lastname" +echo "$address" +echo "$city, $state $zipcode" +echo + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/makedict.sh b/LDP/guide/docbook/abs-guide/makedict.sh new file mode 100644 index 00000000..7a94b97b --- /dev/null +++ b/LDP/guide/docbook/abs-guide/makedict.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# makedict.sh [make dictionary] + +# Modification of /usr/sbin/mkdict script. +# Original script copyright 1993, by Alec Muffett. +# +# This modified script included in this document in a manner +#+ consistent with the "LICENSE" document of the "Crack" package +#+ that the original script is a part of. + +# This script processes text files to produce a sorted list +#+ of words found in the files. +# This may be useful for compiling dictionaries +#+ and for lexicographic research. + + +E_BADARGS=65 + +if [ ! -r "$1" ] # Need at least one +then #+ valid file argument. + echo "Usage: $0 files-to-process" + exit $E_BADARGS +fi + + +# SORT="sort" # No longer necessary to define options + #+ to sort. Changed from original script. + +cat $* | # Contents of specified files to stdout. + tr A-Z a-z | # Convert to uppercase. + tr ' ' '\012' | # New: change spaces to newlines. +# tr -cd '\012[a-z][0-9]' | # Get rid of everything non-alphanumeric + #+ (original script). + tr -c '\012a-z' '\012' | # Rather than deleting + #+ now change non-alpha to newlines. + sort | # $SORT options unnecessary now. + uniq | # Remove duplicates. + grep -v '^#' | # Delete lines beginning with a hashmark. + grep -v '^$' # Delete blank lines. + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/pb.sh b/LDP/guide/docbook/abs-guide/pb.sh new file mode 100644 index 00000000..6f9b9cbc --- /dev/null +++ b/LDP/guide/docbook/abs-guide/pb.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# pb.sh: phone book + +# Written by Rick Boivie, and used with permission. +# Modifications by document author. + +MINARGS=1 # Script needs at least one argument. +DATAFILE=./phonebook +PROGNAME=$0 +E_NOARGS=70 # No arguments error. + +if [ $# -lt $MINARGS ]; then + echo "Usage: "$PROGNAME" data" + exit $E_NOARGS +fi + + +if [ $# -eq $MINARGS ]; then + grep $1 "$DATAFILE" +else + ( shift; "$PROGNAME" $* ) | grep $1 + # Script recursively calls itself. +fi + +exit 0 # Script exits here. + # It's o.k. to put non-hashmarked comments + #+ and data after this point. + +# ------------------------------------------------------------------------ +# Sample "phonebook" datafile: + +John Doe 1555 Main St., Baltimore, MD 21228 (410) 222-3333 +Mary Moe 9899 Jones Blvd., Warren, NH 03787 (603) 898-3232 +Richard Roe 856 E. 7th St., New York, NY 10009 (212) 333-4567 +Sam Roe 956 E. 8th St., New York, NY 10009 (212) 444-5678 +Zoe Zenobia 4481 N. Baker St., San Franciso, SF 94338 (415) 501-1631 +# ------------------------------------------------------------------------ + +$bash pb.sh Roe +Richard Roe 856 E. 7th St., New York, NY 10009 (212) 333-4567 +Sam Roe 956 E. 8th St., New York, NY 10009 (212) 444-5678 + +$bash pb.sh Roe Sam +Sam Roe 956 E. 8th St., New York, NY 10009 (212) 444-5678 + +# When more than one argument passed to script, +#+ prints *only* the line(s) containing all the arguments. diff --git a/LDP/guide/docbook/abs-guide/read-novar.sh b/LDP/guide/docbook/abs-guide/read-novar.sh new file mode 100644 index 00000000..236f01a4 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/read-novar.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +echo + +# -------------------------- # +# First code block. +echo -n "Enter a value: " +read var +echo "\"var\" = "$var"" +# Everything as expected here. +# -------------------------- # + +echo + +echo -n "Enter another value: " +read # No variable supplied for 'read', therefore... + #+ Input to 'read' assigned to default variable, $REPLY. +var="$REPLY" +echo "\"var\" = "$var"" +# This is equivalent to the first code block. + +echo + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/reassign-stdout.sh b/LDP/guide/docbook/abs-guide/reassign-stdout.sh new file mode 100644 index 00000000..5e4b0d41 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/reassign-stdout.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# reassign-stdout.sh + +LOGFILE=logfile.txt + +exec 6>&1 # Link file descriptor #6 with stdout. + # Saves stdout. + +exec > $LOGFILE # stdout replaced with file "logfile.txt". + +# ----------------------------------------------------------- # +# All output from commands in this block sent to file $LOGFILE. + +echo -n "Logfile: " +date +echo "-------------------------------------" +echo + +echo "Output of \"ls -al\" command" +echo +ls -al +echo; echo +echo "Output of \"df\" command" +echo +df + +# ----------------------------------------------------------- # + +exec 1>&6 6>&- # Restore stdout and close file descriptor #6. + +echo +echo "== stdout now restored to default == " +echo +ls -al +echo + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/self-destruct.sh b/LDP/guide/docbook/abs-guide/self-destruct.sh new file mode 100644 index 00000000..6895862f --- /dev/null +++ b/LDP/guide/docbook/abs-guide/self-destruct.sh @@ -0,0 +1,10 @@ +#!/bin/bash +# self-destruct.sh + +kill $$ # Script kills its own process here. + # Recall that "$$" is the script's PID. + +echo "This line will not echo." +# Instead, the shell sends a "Terminated" message to stdout. + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/self-document.sh b/LDP/guide/docbook/abs-guide/self-document.sh new file mode 100644 index 00000000..dfa40be6 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/self-document.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# self-document.sh: self-documenting script +# Modification of "colm.sh". + +DOC_REQUEST=70 + +if [ "$1" = "-h" -o "$1" = "--help" ] # Request help. +then + echo; echo "Usage: $0 [directory-name]"; echo + cat "$0" | sed --silent -e '/DOCUMENTATIONXX$/,/^DOCUMENTATION/p' | + sed -e '/DOCUMENTATIONXX/d'; exit $DOC_REQUEST; fi + +: << DOCUMENTATIONXX +List the statistics of a specified directory in tabular format. +--------------------------------------------------------------- +The command line parameter gives the directory to be listed. +If no directory specified or directory specified cannot be read, +then list the current working directory. + +DOCUMENTATIONXX + +if [ -z "$1" -o ! -r "$1" ] +then + directory=. +else + directory="$1" +fi + +echo "Listing of "$directory":"; echo +(printf "PERMISSIONS LINKS OWNER GROUP SIZE MONTH DAY HH:MM PROG-NAME\n" \ +; ls -l "$directory" | sed 1d) | column -t + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/self-exec.sh b/LDP/guide/docbook/abs-guide/self-exec.sh new file mode 100644 index 00000000..f5937818 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/self-exec.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# self-exec.sh + +echo + +echo "This line appears ONCE in the script, yet it keeps echoing." +echo "The PID of this instance of the script is still $$." +# Demonstrates that a subshell is not forked off. + +echo "==================== Hit Ctl-C to exit ====================" + +sleep 1 + +exec $0 # Spawns another instance of this same script + #+ that replaces the previous one. + +echo "This line will never echo!" # Why not? + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/set-pos.sh b/LDP/guide/docbook/abs-guide/set-pos.sh new file mode 100644 index 00000000..b7c29db9 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/set-pos.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +variable="one two three four five" + +set -- $variable +# Sets positional parameters to the contents of "$variable". + +first_param=$1 +second_param=$2 +shift; shift # Shift past first two positional params. +remaining_params="$*" + +echo +echo "first parameter = $first_param" # one +echo "second parameter = $second_param" # two +echo "remaining parameters = $remaining_params" # three four five + +echo; echo + +# Again. +set -- $variable +first_param=$1 +second_param=$2 +echo "first parameter = $first_param" # one +echo "second parameter = $second_param" # two + +# ====================================================== + +set -- +# Unsets positional parameters if no variable specified. + +first_param=$1 +second_param=$2 +echo "first parameter = $first_param" # (null value) +echo "second parameter = $second_param" # (null value) + +exit 0 diff --git a/LDP/guide/docbook/abs-guide/upperconv.sh b/LDP/guide/docbook/abs-guide/upperconv.sh new file mode 100644 index 00000000..dfaa5238 --- /dev/null +++ b/LDP/guide/docbook/abs-guide/upperconv.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# upperconv.sh +# Converts a specified input file to uppercase. + +E_FILE_ACCESS=70 +E_WRONG_ARGS=71 + +if [ ! -r "$1" ] # Is specified input file readable? +then + echo "Can't read from input file!" + echo "Usage: $0 input-file output-file" + exit $E_FILE_ACCESS +fi # Will exit with same error + #+ even if input file ($1) not specified. + +if [ -z "$2" ] +then + echo "Need to specify output file." + echo "Usage: $0 input-file output-file" + exit $E_WRONG_ARGS +fi + + +exec 4<&0 +exec < $1 # Will read from input file. + +exec 7>&1 +exec > $2 # Will write to output file. + # Assumes output file writable (add check?). + +# ----------------------------------------------- + cat - | tr a-z A-Z # Uppercase conversion. +# ^^^^^ # Reads from stdin. +# ^^^^^^^^^^ # Writes to stdout. +# However, both stdin and stdout were redirected. +# ----------------------------------------------- + +exec 1>&7 7>&- # Restore stout. +exec 0<&4 4<&- # Restore stdin. + +# After restoration, the following line prints to stdout as expected. +echo "File \"$1\" written to \"$2\" as uppercase conversion." + +exit 0