Go to the first, previous, next, last section, table of contents.
ARGC and ARGV
section 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 @command{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 @option{-v}
option (see section 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 @command{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, @command{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 (see section The delete Statement).
All of these actions are typically done in 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 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 @command{awk} program, end the @command{awk} options with @option{--} and then supply the @command{awk} program's options, in the following manner:
awk -f myprog -- -v -d file1 file2 ...
This is not necessary in @command{gawk}. Unless @option{--posix} has
been specified, @command{gawk} silently puts any unrecognized options
into ARGV for the @command{awk} program to deal with. As soon
as it sees an unknown option, @command{gawk} stops looking for other
options that it might otherwise recognize. The previous example with
@command{gawk} would be:
gawk -f myprog -d -v file1 file2 ...
Because @option{-d} is not a valid @command{gawk} option, it and the following @option{-v} are passed on to the @command{awk} program.
Go to the first, previous, next, last section, table of contents.