Differences between revisions 1 and 3 (spanning 2 versions)
Revision 1 as of 2007-05-02 23:24:11
Size: 1255
Editor: redondos
Comment:
Revision 3 as of 2008-03-02 17:55:00
Size: 2047
Editor: GreyCat
Comment: formatting and grammar fixes
Deletions are marked like this. Additions are marked like this.
Line 18: Line 18:
 
Line 37: Line 37:


If your prefer to check options with IFs 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 it 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

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.

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 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 it 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

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.

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