O'Reilly logo

bash Cookbook by Cameron Newham, JP Vossen, Carl Albing

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

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 -cx    # 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,"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 ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required