Sponsored Content
Top Forums UNIX for Advanced & Expert Users Parsing the command line arguments Post 45284 by cbkihong on Wednesday 17th of December 2003 11:02:27 AM
Old 12-17-2003
Yes, I understand your problem. I don't know if any Unix variants have special extensions. Otherwise, from my interpretation of the getopt manpage I believe getopt doesn't expect multiple parameters to a single option, at all.

So, for example, if you invoke this as
./a.out -x abc def -a

Then argv[] is an array consisting of

-x
abc
def
-a

(not showing argv[0] above)

What getopt does is that it monotonically scans forward. It identifies '-x', associates 'abc' as optarg. It doesn't know what 'def' is, and throw it to the end. Then it identifies '-a', and so on. 'def' is left at the end and regarded as a non-option (the index of which you get with optind). Therefore, as getopt proceeds it permutes the order of arguments that appear in argv[].

I made this test program to illustrate the idea:
Code:
#include <stdio.h>
#include <getopt.h>

extern char *optarg;
extern int optind;

int main(int argc, char** argv) {
	int optchr; int i;
	while ((optchr = getopt(argc, argv, "x:a")) != -1) {
		printf("Option '%c' detected.\n", optchr);
		if (optarg) {
			printf("\tArgument: '%s'\n", optarg);
		}
	}
	printf("Other arguments:\n");
	for(i=optind; i<argc; i++) {
		printf("\t%s\n", argv[i]);
	}
	return 0;
}

./a.out -x abc def -a

gives

Code:
Option 'x' detected.
        Argument: 'abc'
Option 'a' detected.
Other arguments:
        def

I think conventional Unix tradition is that there is at most one argument for each option. I think this is because getopt allows options to be given in any order. So if you would like to break this convention you can always write your own routine to parse argv[]. Of course that will not be easy if your program has to accommodate a variety of options. Formally speaking, that requires parser construction knowledge (lexical analysis) that are beyond the scope of this forum.
 

10 More Discussions You Might Find Interesting

1. Programming

command line arguments

Hi How to pass multi line text as a command line argument to a program. (i.e) ./a.out hi this is sample 0 file1 where hi this is sample should be stored in argv 0 in argv and so on... (3 Replies)
Discussion started by: bankpro
3 Replies

2. UNIX for Dummies Questions & Answers

arguments in command line

Hi all, How many arguments can we pass while testing a prgm at command line.. I encountered an issue while passing 10 arguments. For $10 its taking argument passed for $1 followed by 'zero'. can we pass more than 9 arguments /Is there any other way. Thanks, rrs (6 Replies)
Discussion started by: rrs
6 Replies

3. Shell Programming and Scripting

command line arguments

-------------------------------------------------------------------------------- I have this while loop and at the end I am trying to get it to tell me the last argument I entered. And with it like this all I get is the sentence with no value for $1. Now I tried moving done after the sentence... (1 Reply)
Discussion started by: skooly5
1 Replies

4. UNIX for Dummies Questions & Answers

Command line arguments.

I am working on a script wherein i need the user to enter the Build ID for eg:the command line will show enter the build ID Now on entering the build ID it should be assigned to @ARGV. How can this be done.? (1 Reply)
Discussion started by: Varghese
1 Replies

5. Shell Programming and Scripting

Help parsing command line arguments in bash

Looking for a little help parsing some command line arguments in a bash script I am working on, this is probably fairly basic to most, but I do not have much experience with it. At the command line, when the script is run, I need to make sure the argument passed is a file, it exists in the... (3 Replies)
Discussion started by: Breakology
3 Replies

6. Shell Programming and Scripting

Maximum command line arguments

Hi, Can anyone please help me to know what is the maximum number of command line arguments that we can pass in unix shell script? Thanks in advance, Punitha.S (2 Replies)
Discussion started by: puni
2 Replies

7. UNIX for Dummies Questions & Answers

command line arguments

hi, can someone how to accept command line arguments as a variable using in script? like: ./scriptname arguments by accept arguments, I can use it in my script? thx! (1 Reply)
Discussion started by: ikeQ
1 Replies

8. Shell Programming and Scripting

command line arguments

hi,,,, I want to create a command prompt, for example "prompt>", so my prompt need to handle commands, for example "prompt>cmd", so i want to know how to get arguments for my own commands cmd, i.e. default argc should contain arguments count and argv should point to the argument vector i.e, for... (2 Replies)
Discussion started by: vins_89
2 Replies

9. Programming

Parsing command line arguments in Python

Hi, I've a python script called aaa.py and passing an command line option " -a" to the script like, ./aaa.py -a & Inside the script if the -a option is given I do some operation if not something else. code looks like ./aaa.py -a . . if options.a ---some operation--- if not options.a... (1 Reply)
Discussion started by: testin
1 Replies

10. Shell Programming and Scripting

Parsing Command Line Arguments In C shell script

]I have a string like "/abc/cmind/def/pq/IC.2.4.6_main.64b/lnx86" and this string is given by user. But in this string instead of 64b user may passed 32 b an i need to parse this string and check wether its is 32b or 64 b and according to it i want to set appropriate flags. How will i do this... (11 Replies)
Discussion started by: codecatcher
11 Replies
GETOPT(3)						     Linux Programmer's Manual							 GETOPT(3)

NAME
getopt - Parse command line options SYNOPSIS
#include <unistd.h> int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opterr, optopt; #define _GNU_SOURCE #include <getopt.h> int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); int getopt_long_only(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex); DESCRIPTION
The getopt() function parses the command line arguments. Its arguments argc and argv are the argument count and array as passed to the main() function on program invocation. An element of argv that starts with `-' (and is not exactly "-" or "--") is an option element. The characters of this element (aside from the initial `-') are option characters. If getopt() is called repeatedly, it returns successively each of the option characters from each of the option elements. If getopt() finds another option character, it returns that character, updating the external variable optind and a static variable nextchar so that the next call to getopt() can resume the scan with the following option character or argv-element. If there are no more option characters, getopt() returns -1. Then optind is the index in argv of the first argv-element that is not an option. optstring is a string containing the legitimate option characters. If such a character is followed by a colon, the option requires an argument, so getopt places a pointer to the following text in the same argv-element, or the text of the following argv-element, in optarg. Two colons mean an option takes an optional arg; if there is text in the current argv-element, it is returned in optarg, otherwise optarg is set to zero. This is a GNU extension. If optstring contains W followed by a semicolon, then -W foo is treated as the long option --foo. (The -W option is reserved by POSIX.2 for implementation extensions.) This behaviour is a GNU extension, not available with libraries before GNU libc 2. By default, getopt() permutes the contents of argv as it scans, so that eventually all the non-options are at the end. Two other modes are also implemented. If the first character of optstring is `+' or the environment variable POSIXLY_CORRECT is set, then option processing stops as soon as a non-option argument is encountered. If the first character of optstring is `-', then each non-option argv-element is handled as if it were the argument of an option with character code 1. (This is used by programs that were written to expect options and other argv-elements in any order and that care about the ordering of the two.) The special argument `--' forces an end of option-scanning regardless of the scanning mode. 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. If getopt() finds an option character in argv that was not included in optstring, or if it detects a missing option argument, it returns `?' and sets the external variable optopt to the actual option character. If the first character of optstring is a colon (`:'), then getopt() returns `:' instead of `?' to indicate a missing option argument. If an error was detected, and the first character of optstring is not a colon, and the external variable opterr is nonzero (which is the default), getopt() prints an error message. The getopt_long() function works like getopt() except that it also accepts long options, started out by two dashes. Long option names may be abbreviated if the abbreviation is unique or is an exact match for some defined option. A long option may take a parameter, of the form --arg=param or --arg param. longopts is a pointer to the first element of an array of struct option declared in <getopt.h> as struct option { const char *name; int has_arg; int *flag; int val; }; The meanings of the different fields are: name is the name of the long option. has_arg is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, or optional_argument (or 2) if the option takes an optional argument. flag specifies how results are returned for a long option. If flag is NULL, then getopt_long() returns val. (For example, the calling program may set val to the equivalent short option character.) Otherwise, getopt_long() returns 0, and flag points to a variable which is set to val if the option is found, but left unchanged if the option is not found. val is the value to return, or to load into the variable pointed to by flag. The last element of the array has to be filled with zeroes. If longindex is not NULL, it points to a variable which is set to the index of the long option relative to longopts. getopt_long_only() is like getopt_long(), but `-' as well as `--' can indicate a long option. If an option that starts with `-' (not `--') doesn't match a long option, but does match a short option, it is parsed as a short option instead. RETURN VALUE
The getopt() function returns the option character if the option was found successfully, `:' if there was a missing parameter for one of the options, `?' for an unknown option character, or -1 for the end of the option list. getopt_long() and getopt_long_only() also return the option character when a short option is recognized. For a long option, they return val if flag is NULL, and 0 otherwise. Error and -1 returns are the same as for getopt(), plus `?' for an ambiguous match or an extraneous parameter. ENVIRONMENT VARIABLES
POSIXLY_CORRECT If this is set, then option processing stops as soon as a non-option argument is encountered. _<PID>_GNU_nonoption_argv_flags_ This variable was used by bash 2.0 to communicate to GNU libc which arguments are the results of wildcard expansion and so should not be considered as options. This behaviour was removed in bash version 2.01, but the support remains in GNU libc. EXAMPLE
The following example program illustrates the use of getopt_long() with most of its features. #include <stdio.h> /* for printf */ #include <stdlib.h> /* for exit */ #include <getopt.h> int main (int argc, char **argv) { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; int option_index = 0; static struct option long_options[] = { {"add", 1, 0, 0}, {"append", 0, 0, 0}, {"delete", 1, 0, 0}, {"verbose", 0, 0, 0}, {"create", 1, 0, 'c'}, {"file", 1, 0, 0}, {0, 0, 0, 0} }; c = getopt_long (argc, argv, "abc:d:012", long_options, &option_index); if (c == -1) break; switch (c) { case 0: printf ("option %s", long_options[option_index].name); if (optarg) printf (" with arg %s", optarg); printf (" "); break; case '0': case '1': case '2': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements. "); digit_optind = this_option_optind; printf ("option %c ", c); break; case 'a': printf ("option a "); break; case 'b': printf ("option b "); break; case 'c': printf ("option c with value `%s' ", optarg); break; case 'd': printf ("option d with value `%s' ", optarg); break; case '?': break; default: printf ("?? getopt returned character code 0%o ?? ", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf (" "); } exit (0); } BUGS
The POSIX.2 specification of getopt() has a technical error described in POSIX.2 Interpretation 150. The GNU implementation (and probably all other implementations) implements the correct behaviour rather than that specified. CONFORMING TO
getopt(): POSIX.2, provided the environment variable POSIXLY_CORRECT is set. Otherwise, the elements of argv aren't really const, because we permute them. We pretend they're const in the prototype to be compatible with other systems. GNU
2002-02-16 GETOPT(3)
All times are GMT -4. The time now is 11:33 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy