Multiple parameters to bash script
I need to check for user provided options in my bash script, but the options won't always be provided while calling the script. For example the possible options can be -dontbuild -donttest -dontupdate in any combination, is there a way I could check for them? Sorry if this question is real basic, I'm new to bash scripting.
Thanks
EDIT: I tried this chunk of code out, and called the script with the option, -disableVenusBld, but it still prints out "Starting build". Am I doing something wrong? Thanks in advance!
while [ $# -ne 0 ]
do
arg="$1"
case "$arg" in
-disableVenusBld)
disableVenusBld=true
;;
-disableCopperBld)
disableCopperBld=true
;;
-disableTest)
disableTest=true
;;
-disableUpdate)
disableUpdate=true
;;
*)
nothing="true"
;;
esac
shift
done
if [ "$disableVenusBld" != true ]; then
echo "Starting build"
fi
Dennis had the right idea, i'd like to suggest a few minor mods.
Arguments to shell scripts are accessed by positional parameters $1, $2, $3, etc... and the current count comes in $#. The classical check for this would be:
while [ $# -ne 0 ]
do
ARG="$1"
shift # get rid of $1, we saved in ARG already
case "$ARG" in
-dontbuild)
DONTBUILD=1
;;
-somethingwithaparam)
SAVESOMEPARAM="$1"
shift
;;
# ... continue
done
As Dennis says, if your requirements fit into getopts, you're better off using that.
for arg
do
case "$arg" in
-dontbuild)
do_something
;;
-donttest)
do_something
;;
-dontupdate)
do_something
;;
*)
echo "Unknown argument"
exit 1
;;
esac
done
Where do_something
represents either setting a flag or actually doing something. Note that for arg
implicitly iterates over $@
(the array of positional parameters) and is equivalent to the explicit for arg in $@
.
Note also that Bash has a builtin called getopts
but it only takes short options (e.g. -x
). There's also an external utility called getopt
which does take long options but it has several flaws and is not recommended.
options=":es:w:d:"
OLDOPTIND=$OPTIND
while getopts $options option
do
case $option in
e ) do_something;;
w ) do_something $OPTARG;;
d ) foo=$OPTARG;;
q ) do_something;;
s ) case $OPTARG in
m | M ) bar="abc";;
s | S ) baz="def";;
* ) echo "Invalid option for blah blah" 1>&2; exit;;
esac;;
* ) echo "Unimplemented option chosen.";; # DEFAULT
esac
OLDOPTIND=$OPTIND
done