«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:

    # 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:

  • YES: ./script –quick
  • YES: ./script -other –quick

but will stop on first argument with no ”-” in front (or on –):

  • 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.

mirroring/bashfaq/035.txt · Last modified: 2009/07/10 23:13 (external edit)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0