Using `ARGC' and `ARGV'
-----------------------
Note:Built-in Variables That Convey Information,
presented the following 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. This
includes variable assignments done with the `-v' option (Note:Command-Line Options.). Normal variable assignments on the
command line _are_ treated as arguments and do show up in the `ARGV'
array:
$ cat showargs.awk
-| BEGIN {
-| printf "A=%d, B=%d\n", A, B
-| for (i = 0; i < ARGC; i++)
-| printf "\tARGV[%d] = %s\n", i, ARGV[i]
-| }
-| END { printf "A=%d, B=%d\n", A, B }
$ awk -v A=1 -f showargs.awk B=2 /dev/null
-| A=1, B=0
-| ARGV[0] = awk
-| ARGV[1] = B=2
-| ARGV[2] = /dev/null
-| A=1, B=2
A 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, a program can change which files are read. Use `"-"' to
represent the standard input. Storing additional elements and
incrementing `ARGC' causes additional files to be read.
If the value of `ARGC' is decreased, that eliminates input files
from the end of the list. By recording the old value of `ARGC'
elsewhere, a 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. Another option is to use the `delete' statement to remove
elements from `ARGV' (Note:The `delete' Statement.).
All of these actions are typically done in the `BEGIN' rule, before
actual processing of the input begins. Note:Splitting a Large File
into Pieces, and see Note:Duplicating Output into
Multiple Files, for examples 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, end the `awk'
options with `--' and then supply the `awk' program's options, in the
following manner:
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 that it might otherwise
recognize. The previous example with `gawk' would be:
gawk -f myprog -d -v file1 file2 ...
Because `-d' is not a valid `gawk' option, it and the following `-v'
are passed on to the `awk' program.