Precedente: , Su: Variabili predefinite   [Contenuti][Indice]


7.5.3 Usare 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: , Su: Variabili predefinite   [Contenuti][Indice]