GNU Info

Info Node: (gawk.info)ARGC and ARGV

(gawk.info)ARGC and ARGV


Prev: Auto-set Up: Built-in Variables
Enter node , (file) or (file)node

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.


automatically generated by info2www version 1.2.2.9