Marius Hofert Marius Hofert - 6 months ago 14
Bash Question

How to define a shell script with variable number of arguments?

I would like to define a simple abbreviation of a call to

gs
(ghostscript) via a shell script. The first argument(s) give all the files that should be merged, the last one gives the name of the output file. Obviously, the following does not work (it's just for showing the goal):

#!/bin/sh
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$last $1 $2 ...


How can this be done?

One would typically call this script via
myscript infile1.pdf infile2.pdf ... outfile.pdf
or
myscript *.pdf outfile.pdf
.

Answer

The bash variables $@ and $* expand into the list of command line arguments. Generally, you will want to use "$@" (that is, $@ surrounded by double quotes). This will do the right thing if someone passes your script an argument containing.

So if you had this in your script:

outputfile=$1
shift
gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=$outputfile "$@"

And you called your script like this:

myscript out.pdf foo.ps bar.ps "another file.ps"

This would expand to:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOUTPUTFILE=out.pdf foo.ps bar.ps "another file.ps"

Read the "Special Parameters" section of the bash man page for more information.