mirror of https://github.com/tLDP/LDP
new
This commit is contained in:
parent
3078839a7e
commit
387372f731
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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.
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
Loading…
Reference in New Issue