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.