⇤ ← Revision 1 as of 2007-05-02 23:24:11
1255
Comment:
|
1863
by limcore.com woot?
|
Deletions are marked like this. | Additions are marked like this. |
Line 37: | Line 37: |
If your prefer to check options with IFs quickly then: {{{ function HaveOpt { needle=$1 shift while [[ $1 == -* ]]; do case "$1" in --) return 1; # stop now, since -- by convention is end of option arguments $needle) return 0;; esac shift done return 1; } May be useful. Use if like: HaveOpt --quick $* && echo "Option quick is set" and it will work if script is run as: YES: ./script --quick YES: ./script -other --quick but will stop on first no minus argument (or --) NO: ./script -bar foo --quick NO: ./script -bar -- --quick }}} |
How can I handle command-line arguments to my script easily?
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:
while [[ $1 == -* ]]; do case "$1" in -h|--help) show_help; exit 0;; -v) verbose=1; shift;; -f) output_file=$2; shift 2;; 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:
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 $((x-1)) echo "Left overs: $@"
If your prefer to check options with IFs quickly then:
function HaveOpt { needle=$1 shift while [[ $1 == -* ]]; do case "$1" in --) return 1; # stop now, since -- by convention is end of option arguments $needle) return 0;; esac shift done return 1; } May be useful. Use if like: HaveOpt --quick $* && echo "Option quick is set" and it will work if script is run as: YES: ./script --quick YES: ./script -other --quick but will stop on first no minus argument (or --) NO: ./script -bar foo --quick NO: ./script -bar -- --quick