Precedente: Variabili auto-assegnate, Su: Variabili predefinite [Contenuti][Indice]
ARGC
e ARGV
Variabili predefinite con cui awk
fornisce informazioni
conteneva il programma seguente che visualizzava le informazioni contenute
in ARGC
e ARGV
:
$ awk 'BEGIN { > for (i = 0; i < ARGC; i++) > print ARGV[i] > }' inventory-shipped mail-list -| awk -| inventory-shipped -| mail-list
In questo esempio, ARGV[0]
contiene ‘awk’, ARGV[1]
contiene ‘inventory-shipped’ e ARGV[2]
contiene
‘mail-list’.
Si tenga presente che il nome del programma awk
non è incluso in ARGV
.
Le altre opzioni della riga di comando, con i relativi argomenti,
sono parimenti non presenti, compresi anche gli assegnamenti di
variabile fatti tramite l’opzione -v
(vedi la sezione Opzioni sulla riga di comando).
I normali assegnamenti di variabile sulla riga dei comandi sono
trattati come argomenti e quindi inseriti nel vettore ARGV
.
Dato il seguente programma in un file di nome vediargomenti.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 }
la sua esecuzione produce il seguente risultato:
$ awk -v A=1 -f vediargomenti.awk B=2 /dev/null -| A=1, B=0 -| ARGV[0] = awk -| ARGV[1] = B=2 -| ARGV[2] = /dev/null -| A=1, B=2
Un programma può modificare ARGC
e gli elementi di ARGV
.
Ogni volta che awk
arriva alla fine di un file in input, usa
il successivo elemento nel vettore ARGV
come nome del successivo file
in input. Cambiando il contenuto di quella stringa, un programma
può
modificare la lista dei file che sono letti.
Si usi "-"
per rappresentare lo standard input. Assegnando ulteriori
elementi e incrementando ARGC
verranno letti ulteriori file.
Se il valore di ARGC
viene diminuto, vengono ignorati i file in input
posti alla fine della lista. Memorizzando il valore originale di ARGC
da qualche altra parte, un programma può gestire gli argomenti
ignorati come se fossero qualcosa di diverso dai nome-file.
Per eliminare un file che sia in mezzo alla lista, si imposti in ARGV
la stringa nulla
(""
) al posto del nome del file in questione. Come funzionalità
speciale, awk
ignora valori di nome-file che siano stati
rimpiazzati con la stringa nulla.
Un’altra possibilità è quella
di usare l’istruzione delete
per
togliere elementi da ARGV
(vedi la sezione L’istruzione delete
).
Tutte queste azioni sono tipicamente eseguite nella regola BEGIN
,
prima di iniziare l’elaborazione vera e propria dell’input.
Vedi la sezione Suddividere in pezzi un file grosso e
vedi la sezione Inviare l’output su più di un file
per esempi
su ognuno dei modi per togliere elementi dal vettore ARGV
.
Per passare direttamente delle opzioni a un programma scritto in
awk
, si devono terminare le opzioni di awk
con
-- e poi inserire le opzioni destinate al programma awk
,
come mostrato qui di seguito:
awk -f mio_programma.awk -- -v -q file1 file2 …
Il seguente frammento di programma ispeziona ARGV
per esaminare, e
poi rimuovere, le opzioni sulla riga di comando viste sopra:
BEGIN { for (i = 1; i < ARGC; i++) { if (ARGV[i] == "-v") verbose = 1 else if (ARGV[i] == "-q") debug = 1 else if (ARGV[i] ~ /^-./) { e = sprintf("%s: opzione non riconosciuta -- %c", ARGV[0], substr(ARGV[i], 2, 1)) print e > "/dev/stderr" } else break delete ARGV[i] } }
Terminare le opzioni di awk
con -- non è
necessario in gawk
. A meno che non si specifichi --posix,
gawk
inserisce, senza emettere messaggi, ogni opzione non
riconosciuta
nel vettore ARGV
perché sia trattata dal programma awk
.
Dopo aver trovato un’opzione non riconosciuta, gawk
non cerca
ulteriori opzioni, anche se ce ne fossero di riconoscibili.
La riga dei comandi precedente sarebbe
con gawk
:
gawk -f mio_programma.awk -q -v file1 file2 …
Poiché -q non è un’opzione valida per gawk
, quest’opzione
e l’opzione -v che segue sono passate al programma awk
.
(Vedi la sezione Elaborare opzioni specificate sulla riga di comando per una funzione di libreria awk
che analizza le opzioni della riga di comando.)
Nel progettare un programma, si dovrebbero scegliere opzioni che non
siano in conflitto con quelle di gawk
, perché ogni opzioni
accettata da gawk
verrà elaborata prima di passare il resto
della riga dei comandi al programma awk
.
Usare ‘#!’ con l’opzione -E può essere utile in questo caso
(vedi la sezione Programmi awk
da eseguire come script
e
vedi la sezione Opzioni sulla riga di comando).
Precedente: Variabili auto-assegnate, Su: Variabili predefinite [Contenuti][Indice]