Using Arguments in a Shell Script Posted on May 11, 2009 by Dave Fowler

Within 5 seconds of looking at a shell script I'm usually opening a new file in my text editor to re-write the ugliness into something that makes more visual sense. To me at least python is highly preferable.

Still I use shell scripts all the time to batch a group of commonly used sequential executions, or to abbreviate a commonly used but lengthy commands.

Today I looked into going one step further into the complexities of shell scripts, probably my last step for a while, and discovered how to handle arguments.

The inspiring work case was in using Django manager to run tests for the different apps

./manage.py test --settings test_settings <optional app names>

The following script will check if an argument exists and if it does it will use the argument in the tests command.

if [ -n "$1" ]
# Test whether command-line argument is present (non-empty).
then
 ./manage.py test --settings test_settings $1
else
 ./manage.py test --settings test_settings
fi

Notice that $1 refers to the first argument ($0 refers to the name of the executable and $5 refers to the 5th argument).

Save the file as 'test' and then modify it as an executable

chmod +x test

And now I can run the tests on their own

./test

or with an argument app

./test auth_user
Expanding

Note that the above example has a limitation of only dealing with the first argument and seems a bit redundant. The entire script can indeed be shortened to

./manage.py test --settings test_settings $@

As $@ represents all arguments after $0.