SHELLdorado Newsletter 2/2001 - June 25, 2001
================================================================
The "SHELLdorado Newsletter" covers UNIX shell script related
topics. To subscribe to this newsletter, leave your e-mail
address at the SHELLdorado home page:
http://www.shelldorado.com/
"Heiner's SHELLdorado" is a place for UNIX shell script
programmers providing
Many shell script examples,
shell scripting tips & tricks + more...
================================================================
Contents
o What's new at the SHELLdorado?
o Shell Tip: Arrays for Bourne shell
o Shell Tip: Differentiate between empty and unset variables
o Shell Tip: Log out idle users
o Shell Tip: extend PATH variable in .profile
o Q&A: How can I find the home page of a user?
-----------------------------------------------------------------
>> What's new at the SHELLdorado?
-----------------------------------------------------------------
o The SHELLdorado has moved! After being guest of the OASE
shareware organization (http://www.oase-shareware.org) for
more than two years, it now finally has it's own domain
name:
http://www.shelldorado.com/
The old address (http://www.oase-shareware.org/shell/) will
be valid until the end of this year, so there is plenty of
time to adjust old bookmarks.
o If you want to contribute to the "AWK Compatibility List",
there now is an extended AWK feature test script (thanks to
Raffaele Guido Della Valle <valle@rigel1.fci.unibo.it> for
suggestions):
http://www.shelldorado.com/articles/awkcompat.html
If you run an operating system not listed there, you may
help complete the list. Just run the feature test script
from the page, and send the resulting output to
mailto:heiner.steven@shelldorado.com .
-----------------------------------------------------------------
>> Shell Tip: Arrays for Bourne shell
-----------------------------------------------------------------
The Korn shell (and BASH) have built-in support for an array
type. The following code fragment sets an array from the
command line arguments, counts the number of array elements,
and prints them (example does not work with BASH):
#! /usr/bin/ksh
# Set array "args" from command line arguments
set -A args -- "$@"
integer n=${#args[@]} # number of array elements
print "$n arguments:"
integer i=0
while ((i<n))
do
print ${args[i]}
((i=i+1))
done
The standard Bourne shell (/bin/sh) does not have arrays.
Here is a way to simulate them by using "eval" to
dynamically generate variable names:
# "arrays" for the bourne shell
# Set the variables "var1", "var2", ... with the command line
# arguments
n=0
for value
do
n=`expr $n + 1`
eval var$n="'""$value""'"
done
# print the variable values
echo "$n variables are set:"
i=0
while [ $i -lt $n ]
do
i=`expr $i + 1`
eval echo '"$'"var$i"'"'
done
The quoting at first seems to be unnecessary complex, but it
ensures, that variables can contain "whitespace" characters,
and even a quotation mark ("). The exception to this rule is
the single quote character ('), which will not be preserved.
-----------------------------------------------------------------
>> Shell Tip: Differentiate between empty and unset variables
-----------------------------------------------------------------
If we want to find out if a variable is empty, we usually
use a code fragment like the following:
if [ -z "$varname" ]
then
echo "varname is empty"
fi
In the example above, we do not know if the variable did not
exist because it was not set anywhere), or if it was set to
an empty value (e.g. using "varname="). Sometimes it's
useful to know the difference, e.g. if the script provides
default values for unset variables, but allows the user to
specify an empty value.
In this case we could find out if a variable is empty or not
set using the following scheme:
#variable=
if [ -z "$variable" ]
then # variable is empty
if [ ${variable+EMPTY} = EMPTY ]
then echo variable is empty, but set
else echo variable is not set
fi
else # variable contains value
echo "variable has a value"
fi
We use the feature that ${var+VALUE} returns "VALUE" if $var
is set, even if it is set to an empty string.
Refer to the "Parameters" section of the sh(1) or ksh(1)
manual page for a description of other parameter
substitutions.
-----------------------------------------------------------------
>> Shell Tip: Log out idle users
-----------------------------------------------------------------
System administrators know the problem: users forget to log
out, and leave sessions "hanging" and using system resources
until the system reboots.
Some shells have the feature of setting a timeout value: if
the user did not enter anything for a specified time span
(e.g. 60 minutes), the session is terminated automatically.
The Korn Shell (/usr/bin/ksh) has the TMOUT variable, that
can be set to the number of seconds idle time after which
the session will terminate. A system administrator could
want to set this variable e.g. in the system-wide startup
file /etc/profile:
TMOUT=3600 # logout after one hour idle time
The TCSH has the environment variable "autologout", which
may be set to the number of idle minutes (not seconds)
before the user should be logged out.
-----------------------------------------------------------------
>> Shell Tip: extend PATH variable in .profile
-----------------------------------------------------------------
After login, most shell dialects read in the file
$HOME/.profile (this does not apply to CSH and dialects).
Usually this file is used to set or extend the PATH variable
with additional directory names that the shell should search
commands in, and the resulting code looks similar to the
following:
PATH=$HOME/bin:$PATH:/usr/local/bin
export PATH
This is perfectly legal. In reality, the assignment tends to
become rather large. Sometimes the PATH variable may contain
a directory more than once, or even invalid directories.
Since all directories of the PATH may be searched for each
command executed, this could cost time.
The following lines add directories to the PATH variable
once, and check if the directory exists:
OldPath=`echo "$PATH" | tr : ' '`
# Special handling: a leading or trailing ":" means:
# "current directory"
PATH=`echo "$PATH" | sed -e 's/^://' -e 's/:$//'`
PATH=:.:
for p in $HOME/local/bin $HOME/cmds $HOME/bin \
/opt/Summertime_98.sparc/bin \
$OldPath
/bin /usr/bin /usr/sbin /usr/local/bin
do
case "$PATH" in
*:${p}:*) ;; # Directory already in PATH
*)
[ -d "$p" ] && PATH="$PATH$p:" ;;
esac
done
# Remove unnecessary colons at start and end:
PATH=`echo "$PATH" | sed -e 's/^://' -e 's/:$//'`
export PATH
-----------------------------------------------------------------
>> Q&A: How can I find the home page of a user?
-----------------------------------------------------------------
The usual way to find a home page is to use search engines
like Google (http://www.google.com) or Yahoo!
(http://www.yahoo.com). But sometimes we already have some
hints, e.g. an e-mail address, that could be used to make an
"educated guess" at the home page.
Have a look at the following (not completely fictional)
e-mail address:
heiner.steven@odn.de
We now could assume, that "heiner.steven" is the name of the
user on the system specified. The web home directory of the
user is specified using "~heiner.steven" (note the leading
"~" [tilde] character), resulting in the URL
http://odn.de/~heiner.steven # will not work!
If this guess did not succeed, we could try some
modifications on the user name, e.g. "hsteven", "heiners",
and try to get the resulting web page name.
If these pages did still not exist, we could try to
systematically modify some other parts of the web address,
e.g. the directory part ("/", "/homes/", ...), the domain
name part ("people.odn.de", "www.odn.de",
"homes.odn.de", ...).
This method is successful for a surprising wide range of
e-mail addresses. Some scripts using this method guessing
home pages given an e-mail address are available at the
SHELLdorado:
http://www.shelldorado.com/scripts/quickies/guesshomepage
http://www.shelldorado.com/scripts/quickies/findhomepage
[additional scripts may be needed]
The idea was first used by Jonathan Shake and Marc
Langheinrich in the "Ahoy!" home page search engine at the
University of Washington (they used additional methods to
find the home page). Interested readers can read a paper on
"Ahoy!" at the following URL:
http://www.cs.washington.edu/homes/etzioni/papers/paper.html
----------------------------------------------------------------
If you want to comment on the newsletter, have suggestions for
new topics to be covered in one of the next issues, or even want
to submit an article of your own, send a mail to
mailto:heiner.steven@shelldorado.com
================================================================
To unsubscribe send a mail with the body "unsubscribe" to
newsletter@shelldorado.com
================================================================