Parsing Command-Line Arguments
Problem
You want to write a simple shell script to print a line of dashes, but you want to parameterize it so that you can specify different line lengths and specify a character to use other than just a dash. The syntax would look like this:
dashes # would print out 72 dashes dashes 50 # would print out 50 dashes dashes -c = 50 # would print out 50 equal signs dashes -c x # would print out 72 x characters
What’s an easy way to parse those simple arguments?
Solution
For serious scripting, you should use the getopts built-in.
But we would like to show you the case statement in action, so for this simple
situation we’ll use case for argument
parsing.
Here’s the beginning of the script (see Starting Simple by Printing Dashes for a complete remove):
#!/usr/bin/env bash
# cookbook filename: dashes
#
# dashes - print a line of dashes
#
# options: # how many (default 72)
# -c X use char X instead of dashes
#
LEN=72
CHAR='-'
while (( $# > 0 ))
do
case $1 in
[0-9]*) LEN=$1
;;
-c) shift;
CHAR=${1:--}
;;
*) printf 'usage: %s [-c X] [#]\n' $(basename $0) >&2
exit 2
;;
esac
shift
done
#
# more...Discussion
The default length (72) and the default character (-) are set at
the beginning of the script (after some useful comments). The while loop allows us to parse more than one
parameter. It will keep looping while the number of arguments ($#) is
above zero.
The case statement matches
three different patterns. First, the [0-9]* will match any digit followed by any other characters. ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access