Go to the first, previous, next, last section, table of contents.


Using ARGC and ARGV

In section Built-in Variables that Convey Information, you saw this program describing the information contained in ARGC and ARGV:

$ awk 'BEGIN {
>        for (i = 0; i < ARGC; i++) 
>            print ARGV[i] 
>      }' inventory-shipped BBS-list
-| awk
-| inventory-shipped
-| BBS-list

In this example, ARGV[0] contains "awk", ARGV[1] contains "inventory-shipped", and ARGV[2] contains "BBS-list".

Notice that the awk program is not entered in ARGV. The other special command line options, with their arguments, are also not entered. But variable assignments on the command line are treated as arguments, and do show up in the ARGV array.

Your program can alter ARGC and the elements of ARGV. Each time awk reaches the end of an input file, it uses the next element of ARGV as the name of the next input file. By storing a different string there, your program can change which files are read. You can use "-" to represent the standard input. By storing additional elements and incrementing ARGC you can cause additional files to be read.

If you decrease the value of ARGC, that eliminates input files from the end of the list. By recording the old value of ARGC elsewhere, your program can treat the eliminated arguments as something other than file names.

To eliminate a file from the middle of the list, store the null string ("") into ARGV in place of the file's name. As a special feature, awk ignores file names that have been replaced with the null string. You may also use the delete statement to remove elements from ARGV (see section The delete Statement).

All of these actions are typically done from the BEGIN rule, before actual processing of the input begins. See section Splitting a Large File Into Pieces, and see section Duplicating Output Into Multiple Files, for an example of each way of removing elements from ARGV.

The following fragment processes ARGV in order to examine, and then remove, command line options.

BEGIN {
    for (i = 1; i < ARGC; i++) {
        if (ARGV[i] == "-v")
            verbose = 1
        else if (ARGV[i] == "-d")
            debug = 1
        else if (ARGV[i] ~ /^-?/) {
            e = sprintf("%s: unrecognized option -- %c",
                    ARGV[0], substr(ARGV[i], 1, ,1))
            print e > "/dev/stderr"
        } else
            break
        delete ARGV[i]
    }
}

To actually get the options into the awk program, you have to end the awk options with `--', and then supply your options, like so:

awk -f myprog -- -v -d file1 file2 ...

This is not necessary in gawk: Unless `--posix' has been specified, gawk silently puts any unrecognized options into ARGV for the awk program to deal with.

As soon as it sees an unknown option, gawk stops looking for other options it might otherwise recognize. The above example with gawk would be:

gawk -f myprog -d -v file1 file2 ...

Since `-d' is not a valid gawk option, the following `-v' is passed on to the awk program.


Go to the first, previous, next, last section, table of contents.