bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Handling options with optional arguments with getopts


From: Robert Elz
Subject: Re: Handling options with optional arguments with getopts
Date: Fri, 27 Aug 2021 23:02:59 +0700

    Date:        Fri, 27 Aug 2021 15:05:52 +0000
    From:        nigelberlinguer via Bug reports for the GNU Bourne Again SHell 
<bug-bash@gnu.org>
    Message-ID:  
<0IgsinjPxg5VSubCxyc64u9axdDTEubUNcQFmIaPyduotl2CyQ9g71uoLtpmXL2hUph1_eHzVRnEZ7vyyHFKqqy3OlPydQXccd2CkHyzpjA=@protonmail.com>

  | I am trying to use getopts so one of the options can use
  | an optional argument.

getopts is required by POSIX to:

        The getopts utility shall retrieve options and option-arguments
        from a list of parameters. It shall support the Utility Syntax
        Guidelines 3 to 10, inclusive, described in XBD Section 12.2

XBD 12.2 guideline 7 is:

        Guideline 7: Option-arguments should not be optional.

That is, if you want to be able to give an option arg, or not give one,
those should be implemented as 2 separate options.

That said, getopts also:

        If an option-argument is missing:

            � If the first character of optstring is a <colon>,
              the shell variable specified by name shall be set to the
              <colon> character and the shell variable OPTARG shall be
              set to the option character found.

which means that you can do

        while getopts :abc:d var
        do
                case "${var}" in
                a)      .... ;;
                b)      .... ;;
                c)  carg=${OPTARG}; .... ;;
                d)      .... ;;
                :)  case "${OPTARG}" in
                    c) carg=Missing; .... ;;
                    *) usage ... ;;
                    esac
                ?)  usage Bad arg "${OPTARG}" ... ;;
                esac
        done

or something like that ... but beware that it only actually works
when the option that might have an arg is last in the args given, so
in the case above

                script -a -c

would do what you want, but

                script -c -a

would not, there "-a" is the arg to the -c option, not an option itself.
There is no way (certainly no portable way) around that.

kre





reply via email to

[Prev in Thread] Current Thread [Next in Thread]