Differences between revisions 1 and 2
Revision 1 as of 2007-05-02 23:24:11
Size: 1255
Editor: redondos
Comment:
Revision 2 as of 2008-03-02 00:16:06
Size: 1863
Editor: brt48
Comment: 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

}}}

Anchor(faq35)

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

BashFAQ/035 (last edited 2024-02-26 07:51:38 by larryv)