Shell Script Examples
| Example Shell Script: ls convenience | 1/8 |
One use for shell scripts is to provide a more convenient way of executing a complex pipeline or even just a single command with a complicated set of switches.
User often give these scripts very short names to save typing.
Here is one named l (that's the lower-case letter "ell") runs the ls command with a set of commonly used options.
ls -las "$@"
| Example Shell Script: Arguments | 2/8 |
A simple shell script which prints details of its arguments.
echo My name is $0 echo My process number is $$ echo I have $# arguments echo My arguments separately are $* echo My arguments together are "$@" echo My 5th argument is "'$5'"
% cd /home/cs2041/public_html/lec/shell/examples % ./args.sh abc 1248 42 forty-two 'forty two' My name is ./args.sh My process number is 27876 I have 5 arguments My arguments separately are abc 1248 42 forty-two forty two My arguments together are abc 1248 42 forty-two forty two My 5th argument is 'forty two'
| Example Shell Script: Word Frequency | 3/8 |
Count the number of time each different word occurs in the files given as arguments.
sed 's/ /\n/g' "$@"| # convert to one word per line tr A-Z a-z| # map uppercase to lower case sed "s/[^a-z']//g"| # remove all characters except a-z and ' egrep -v '^$'| # remove empty lines sort| # place words in alphabetical order uniq -c| # use uniq to count how many times each word occurs sort -n # order words in frequency of occurrance
For example
% cd /home/cs2041/public_html/lec/shell/examples % ./word_frequency.sh dracula.txt|tail 2124 it 2440 that 2486 in 2549 he 2911 a 3600 of 4448 to 4740 i 5833 and 7843 the
| Example Shell Script: Counting | 4/8 |
A utility script to print the sub-range of integers specified by its arguments.
Useful to use on the command line or from other scripts
if test $# = 1
then
start=1
finish=$1
elif test $# = 2
then
start=$1
finish=$2
else
echo "Usage: $0 <start> <finish>" 1>&2
exit 1
fi
for argument in "$@"
do
if echo "$argument"|egrep -v '^-?[0-9]+$' >/dev/null
then
echo "$0: argument '$argument' is not an integer" 1>&2
exit 1
fi
done
number=$start
while test $number -le $finish
do
echo $number
number=`expr $number + 1` # or number=$(($number + 1))
done
| Example Shell Script: Finding | 5/8 |
Search $PATH for the specified programs
if test $# = 0
then
echo "Usage $0: <program>" 1>&2
exit 1
fi
for program in "$@"
do
program_found=''
for directory in `echo "$PATH" | tr ':' ' '`
do
f="$directory/$program"
if test -x "$f"
then
ls -ld "$f"
program_found=1
fi
done
if test -z $program_found
then
echo "$program not found"
fi
done
Alternative implementation using while, and a cute use of grep and ||
if test $# = 0
then
echo "Usage $0: <program>" 1>&2
exit 1
fi
for program in "$@"
do
echo "$PATH"|
tr ':' '\n'|
while read directory
do
f="$directory/$program"
if test -x "$f"
then
ls -ld "$f"
fi
done|
egrep '.' || echo "$program not found"
done
And another implementation using while, and a cute use of grep and ||
if test $# = 0
then
echo "Usage $0: <program>" 1>&2
exit 1
fi
for program in "$@"
do
n_path_components=`echo $PATH|tr -d -c :|wc -c`
index=1
while test $index -le $n_path_components
do
directory=`echo "$PATH"|cut -d: -f$index`
f="$directory/$program"
if test -x "$f"
then
ls -ld "$f"
program_found=1
fi
index=`expr $index + 1`
done
test -n $program_found || echo "$program not found"
done
| Example Shell Script: Convert Filenames to Lowercase | 6/8 |
A script to convert the specified filenames to lower case.
if test $# = 0
then
echo "Usage $0: <files>" 1>&2
exit 1
fi
for filename in "$@"
do
new_filename=`echo "$filename" | tr A-Z a-z`
test "$filename" = "$new_filename" && continue
if test -r "$new_filename"
then
echo "$0: $new_filename exists" 1>&2
elif test -e "$filename"
then
mv "$filename" "$new_filename"
else
echo "$0: $filename not found" 1>&2
fi
done
| Example Shell Script: Watch a Website | 7/8 |
A script to repeated download a webpage until it matches a regex then notify an e-mail address.
For example to get e-mail when Kesha tickets (not for yourself of course) go on sale you might run:
% watch_website.sh http://ticketek.com.au/ 'Ke[sS$]+ha' andrewt@cse.unsw.edu.au
repeat_seconds=300 #check every 5 minutes
if test $# = 3
then
url=$1
regexp=$2
email_address=$3
else
echo "Usage: $0 <url> <regex>" 1>&2
exit 1
fi
while true
do
if wget -O- -q "$url"|egrep "$regexp" >/dev/null
then
echo "Generated by $0" | mail -s "$url now matches $regexp" $email_address
exit 0
fi
sleep $repeat_seconds
done
| Example Shell Script: convert GIF files to PNG | 8/8 |
This scripts converts GIF files to PNG files via the intermediate PPM format.
if [ $# -eq 0 ]
then
echo "Usage: $0 files..." 1>&2
exit 1
fi
if ! type giftopnm 2>/dev/null
then
echo "$0: conversion tool giftopnm not found " 1>&2
exit 1
fi
# missing "in ..." defaults to in "$@"
for f
do
case "$f" in
*.gif)
# OK, do nothing
;;
*)
echo "gif2png: skipping $f, not GIF"
continue
;;
esac
dir=`dirname "$f"`
base=`basename "$f" .gif`
result="$dir/$base.png"
giftopnm "$f" | pnmtopng > $result && echo "wrote $result"
done
No comments:
Post a Comment