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.