<Precedenti | Contenuti | Succ.>
Accesso agli elementi dell'array
Quindi a cosa servono gli array? Proprio come molte attività di gestione dei dati possono essere eseguite con un foglio di calcolo, molte attività di programmazione possono essere eseguite con gli array.
Consideriamo un semplice esempio di raccolta e presentazione dei dati. Costruiremo uno script che esamini i tempi di modifica dei file in una directory specificata. Da questi dati, il nostro script produrrà una tabella che mostra a quale ora del giorno i file sono stati modificati l'ultima volta. Tale script potrebbe essere utilizzato per determinare quando un sistema è più attivo. Questo script, chiamato ore, produce questo risultato:
[io@linuxbox~]$ ore .
ora | File | ora | File |
---- | ----- | ---- | ----- |
00 | 0 | 12 | 11 |
01 | 1 | 13 | 7 |
02 | 0 | 14 | 1 |
03 | 0 | 15 | 7 |
04 | 1 | 16 | 6 |
05 | 1 | 17 | 5 |
06 | 6 | 18 | 4 |
07 | 3 | 19 | 4 |
08 | 1 | 20 | 1 |
09 | 14 | 21 | 0 |
10 | 2 | 22 | 0 |
11 | 5 | 23 | 0 |
File totali = 80
Eseguiamo il ore programma, specificando la directory corrente come destinazione. Produce una tabella che mostra, per ogni ora del giorno (0-23), quanti file sono stati modificati l'ultima volta. Il codice per produrlo è il seguente:
#! / Bin / bash
# ore: script per contare i file in base all'utilizzo del tempo di modifica () {
echo "utilizzo: ${0##*/} directory" >&2
}
#! / Bin / bash
# ore: script per contare i file in base all'utilizzo del tempo di modifica () {
echo "utilizzo: ${0##*/} directory" >&2
}
# Verifica che l'argomento sia una directory se [[ ! -d $1 ]]; poi
uscita d'uso 1
fi
# Inizializza l'array
per io in {0..23}; fare ore[i]=0; fatto
# Raccogliere dati
for i in $(stat -c %y "$1"/* | cut -c 12-13); fai j=${i/#0}
((++ore[j])) ((++count))
fatto
# Mostra dati
echo -e "Ora\tFile\tOra\tFile" echo -e "----\t-----\t----\t-----" for i in {0..11} ; fare
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${ore[i]} $j ${ore[j]} fatto
printf "\nFile totali = %d\n" $count
# Verifica che l'argomento sia una directory se [[ ! -d $1 ]]; poi
uscita d'uso 1
fi
# Inizializza l'array
per io in {0..23}; fare ore[i]=0; fatto
# Raccogliere dati
for i in $(stat -c %y "$1"/* | cut -c 12-13); fai j=${i/#0}
((++ore[j])) ((++count))
fatto
# Mostra dati
echo -e "Ora\tFile\tOra\tFile" echo -e "----\t-----\t----\t-----" for i in {0..11} ; fare
j=$((i + 12))
printf "%02d\t%d\t%02d\t%d\n" $i ${ore[i]} $j ${ore[j]} fatto
printf "\nFile totali = %d\n" $count
Lo script è costituito da una funzione (uso) e un corpo principale con quattro sezioni. Nella prima sezione, controlliamo che ci sia un argomento della riga di comando e che sia una directory. In caso contrario, visualizziamo il messaggio di utilizzo e usciamo.
La seconda sezione inizializza l'array ore. Lo fa assegnando a ciascun elemento un valore pari a zero. Non è richiesto alcun requisito speciale per preparare gli array prima dell'uso, ma il nostro script deve garantire che nessun elemento sia vuoto. Notare l'interessante modo in cui è costruito il ciclo. Utilizzando l'espansione del tutore ({0..23}), siamo in grado di generare facilmente una sequenza di parole per il per comando.
La sezione successiva raccoglie i dati eseguendo il stat programma su ogni file nella directory. Noi usiamo taglio per estrarre l'ora a due cifre dal risultato. All'interno del ciclo, dobbiamo rimuovere gli zeri iniziali dal campo dell'ora, poiché la shell tenterà (e alla fine fallirà) di interpretare i valori da "00" a "09" come numeri ottali (vedere la Tabella 34-2). Successivamente, incrementiamo il valore dell'elemento dell'array corrispondente all'ora del giorno. Infine, incrementiamo un contatore (contare) per tenere traccia del numero totale di file nella directory.
L'ultima sezione dello script mostra il contenuto dell'array. Prima emettiamo un paio di righe di intestazione e poi inseriamo un ciclo che produce quattro colonne di output. Infine, emettiamo il conteggio finale dei file.