«Anchor(faq35)»
Well, that depends a great deal on what you want to do with them. Here's a general template that might help for the simple cases:
# Bash
while [[ $1 == -* ]]; do
case "$1" in
-h|--help|-\?) show_help; exit 0;;
-v) verbose=1; shift;;
-f) output_file=$2; shift 2;;
--) shift; break;;
-*) echo "invalid option: $1"; show_help;exit 1;;
esac
done
Now all of the remaining arguments are the filenames which followed the optional switches. You can process those with `for i` or `”$@“`.
For more complex/generalized cases, or if you want things like ”-xvf” to be handled as three separate flags, you can use `getopts`. (NEVER use getopt(1)!)
Here is a simplistic `getopts` example:
# POSIX
x=1 # Avoids an error if we get no options at all.
while getopts "abcf:g:h:" opt; do
case "$opt" in
a) echo "You said a";;
b) echo "You said b";;
c) echo "You said c";;
f) echo "You said f, with argument $OPTARG";;
g) echo "You said g, with argument $OPTARG";;
h) echo "You said h, with argument $OPTARG";;
esac
x=$OPTIND
done
shift $<nowiki>((</nowiki>$x-1<nowiki>))</nowiki>
echo "Left overs: $@"
If your prefer to check options with `if` statements, then a function like this one may be useful:
# Bash
[[HaveOpt]]() {
local needle=$1
shift
while [[ $1 == -* ]]; do
case "$1" in
--) return 1; # by convention, -- is end of options
$needle) return 0;;
esac
shift
done
return 1
}
if [[HaveOpt]] --quick "$@"; then echo "Option quick is set"; fi
and it will work if script is run as:
but will stop on first argument with no ”-” in front (or on –):
Of course, this approach (iterating over the argument list every time you want to check for one) is far less efficient than just iterating once and setting flag variables.