8

When parsing command line arguments with GNU getopt command, how do I (if possible) do recognize -? as another option? Is there a way to escape it in the opstring?

angus
  • 12,131
  • 3
  • 44
  • 40

3 Answers3

6

The GNU getopt command uses the GNU getopt() library function to do the parsing of the arguments and options.

The man page getopt(3) states:

If getopt() does not recognize an option character, it prints an error message to stderr, stores the character in optopt, and returns ?. The calling program may prevent the error message by setting opterr to 0.

Therefore ? is used to signal "unknown option" and cannot be used as an option value. (It would be impossible to tell the option -? from an unknown option.)

Riccardo Murri
  • 16,238
  • 4
  • 56
  • 46
  • At the C level, you can find out if the `?` was real by checking the original string. But apparently GNU `getopt(1)` just eats up the `-?` and returns 1. `getopts` is less confused (except, oddly, in ATT ksh), but doesn't expose the index of the character in the `$OPTIND`th parameter, which means you have to redo a lot of the work if you get a parameter like `-a?b`. – Gilles 'SO- stop being evil' Jun 28 '11 at 12:36
3

Even if you could recognize that as an option string, it would be a really bad idea to use the question mark character as a real argument because most shells use this as part of their glob syntax (representing that the character before it is optionally use or not in the match). Passing a litteral ? would be difficult for users because they would have to escape it.

If you are creating a help option of some kind the usual syntax is to look for short and long options of -h and --help.

Caleb
  • 69,278
  • 18
  • 196
  • 226
1

To get the effect of using the question mark for help, try simply checking to see if the unknown option is indead the question mark character.

For example, I want to print out a message "Unknown option" whenever the unknown option is NOT the question mark. Next I always call my usage function.

\?) if [ "$OPTARG" != "?" ] ; then echo "Unknown option \"$OPTARG\"" ; fi
        usage

In general, I would agree and use the h option for help and the u option for usage, but I had already used those for host and user and I liked it that way.

PS. I'm using bash on Solaris 10.

user118779
  • 11
  • 1