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. ...
Get bash Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.