Manuali, links, fotografie e tanto altro
alla portata di un semplice click!
 
 Benvenuto Ospite
Manuali, immagini, fotografie e tanto altro a portata di un click

Cartoline virtuali

Cartolina n° 448



Sono presenti 1307 cartoline virtuali. Entra ora


Giochi online
Fire Fighter


1. ermesiti: 208,000
2. Mike86: 106,300
3. Daygo: 32,800

Visualizza tutti i giochi.

News Reader















Guida al Bash Scripting - Volume 4
.: Data Pubblicazione 03-Nov-2004 :: Letture:: 1087 :: Recensione :: Stampa solo questa pagina :: Stampa pagina con tutte le sottopagine:.
Sommario

+ Introduzione
+ I Cicli iterativi
+ Come r0xare con i cicli iterativi =)
+ Programmino finale
+ Conclusione

- Introduzione
La scorsa volta, e' stato spiegato come inserire nei nostri script in bash i
famosi if, then e else. Le strutture di controllo a selezione sono uno dei 
due punti fondamentali di un linguaggio di programmazione, L'altro punto riguarda 
i cicli iterativi.
In questa lezione vedremo come usarli al meglio per fare le cose piu'
impensabili.

- I Cicli iterativi
Dunque, spesso il nostro calcolatore si trova a dover eseguire la stessa
operazione ripetutamente.. In bash, come in altri linguaggi (penso proprio in
*tutti* i linguaggi) esistono delle istruzioni che permettono di automizzare
queste operazioni.
Prima di proseguire, vorrei insegnarvi un piccolo trucchetto che a quanto
vedo fino ad ora non era stato ancora spiegato...
Se io voglio racchiudere in una variabile l'output di un determinato comando
(e' utilissimo nel 99% dei casi) mi basta racchiudere il comando tra gli
apici inversi, come in questo esempio:

VARIABILE=`echo ciao`

In questo caso assegnamo a $VARIABILE l'output del comando "echo ciao"
(quindi "ciao"). Ovviamente avremmo potuto fare anche cosi':

VARIABILE="ciao"

Ma se volessimo racchiudere in una variabile la lista dei file in una
directory ? Non c'e' altro modo che:

VARIABILE=`ls /mia/dir`

OK... ora torniamo ai cicli, il primo ciclo che prendiamo in esame e' il
ciclo "for", il piu' semplice, ecco un programmino d'esempio:

#!/bin/bash
LISTATO=`ls`   # assegnamo alla variabile LISTATO la lista dei files.
N_FILE=`ls | sort | wc -l`  # questo e' il numero di files nella lista,
                            # pipe r0x =).

echo "Nella cartella `pwd` ci sono $N_FILE elementi, ora li listo"

for file in $LISTATO  # per ogni linea della variabile $LISTATO assegna la
                      # linea alla variabile $file
do                    # e per ogni sua linea, fai le seguenti operazioni.

     echo "$file"

done                  # chiude il ciclo

# EOF

Ecco, questo e' un esempio pratico di come e' possibile fare la lista dei
file in una dir con un for. Non e' molto difficile.

Passiamo ora al ciclo di tipo while. Riscriviamo qualcosa di simile al 
programmino sopra ma utilizzando while.

#!/bin/bash
N_FILE=`ls | sort | wc -l`
CONTATORE="0"

while [ $CONTATORE -ne $N_FILE ]  # finche' la variabile $CONTATORE, non e'
                                  # uguale alla variabile $N_FILE, esegui
                                  # le seguenti operazioni.
do
    echo "i file su `pwd` non sono ancora finiti
    let CONTATORE=CONTATORE+1     # aumenta $CONTATORE di uno
done

echo "ora sono finiti, ne ho contati $CONTATORE !"

# EOF

Bene, questo esempio, e' assolutamente inutile al lato pratico, in quanto
avrei potuto usare da subito la variabile $N_FILE per indicare quanti
elementi c'erano dentro la directory, pero' e' servito a farvi vedere come
funziona il while.

n.b. per dare delle "condizioni" a while abbiamo usato "test" come per gli if.

L'ultimo ciclo che vedremo oggi e' "until", che e' praticamente la stessa
cosa di while, ma all'inverso, riscriviamo il programma di prima ma
utilizzando until:

#!/bin/bash
N_FILE=`ls | sort | wc - l`
CONTATORE="0"

until [ $CONTATORE -eq $N_FILE ]  
do
    echo "i file su pwd non sono ancora finiti
    let CONTATORE=CONTATORE+1     
done
	
echo "ora sono finiti, ne ho contati $CONTATORE !"
	
# EOF

Come vedete, per adattare il programma e' stato sufficente modificare la
condizione tra le parentesi quadre, prima il programma controllava che le
due variabili non fossero uguali e fino a quando questo era verificato,
eseguiva le operazioni da noi richieste. Ora invece il programma controlla
che la variabile $CONTATORE sia *uguale* alla variabile $N_FILE, e fino a
quando questo *non* succede, il programma esegue le operazioni contenute fra
do e done.

- r0xiamo con i cicli iterativi =)
E' possibile fare cose impensabili con i cicli iterativi, io ad esempio,
quando voglio guardare tutte le immagini in una dir, faccio cosi':

for file in `ls *.jpg | sort`; do ee $file; done

questo semplice for, per ogni file jpeg dentro la dir corrente, esegue
l'operazione "ee $file", "ee" e' semplicemente un programma per aprire le
immagini facile e leggero.
Un altro esempio puo' essere questo:

for ip in `cat file.txt`; do nmap -sS -o $ip >> report.txt; done

per ogni riga (in questo caso le righe sono indirizzi ip) dentro il file
file.txt, fai un nmap all'ip e scrivi il risultato sul file report.txt.

Questo e' molto utile nel caso abbiate una rete interna e volete fare un
portscan su tutti gl indirizzi ip, ma c'e' un modo piu' efficace, guardate:

for number in `seq 0 255`; do nmap -sS -o 192.168.200.$number >> miarete.txt; done

Ecco fatto, seq, e' un programma che non fa altro che ritornare numeri in
sequenza (ad esempio seq 1 5 stampa i numeri da 1 a 5), con questo script
possiamo scannare tutta la subnet 192.168.200.* =)

- Programmino finale

#!bin/bash
function mvall(){
echo $file > .file
ONE=cat .file | cut -d '.'
mv $file $ONE.$EST
echo "$file rinominato in $ONE.$EST"
rm -rf .file
}
echo -n "Resinaro present: "
echo "«Rinominatore estensioni»"
echo -n "Inserire la cartella dei file da rinominare (es./bin/) "
read DIR
echo -n "Inserire
la nuova estensione (es. txt) "
read EST
cd $DIR
for file in ls -F | grep -v "/"
do mvall
done
------- EOF =) --------

#########################################
#               SPIEGAZIONE:            #
# Rinomina TUTTI i file della directory #
# da noi specificata nell'estensione da #
# noi specificata.                      #
#########################################

Bene, a questo punto sta alla vostra fantasia cominciare a fare qualcosina
con il bash.

- Conclusione
In questa lezione e' stato analizzato, l'ultimo punto *fondamentale* del
bash scripting, che come avrete avuto modo di notare, e' particolarmente
facile e potente.
Infatti la sua potenza, non sta nella quantita' di istruzioni native, ma
nella possibilita' di poter utilizzare in modo dinamico tutti i programmi
esterni che abbiamo sulla nostra box. E' questa l'enorme potenzialita' che
rende bash il linguaggio di automazione perfetto per gli admin.
Le prossime lezioni (dopo qualcuna ancora strettamente innerente alle
funzioni e alle sintassi varie) saranno per lo piu' strutturate sugli esempi
pratici e verranno forniti script utili anche per la gestione del vostro
sistema.
.: Ritorna ad argomento Programmazione :: Ritorna a Indice Argomenti :.
Network: Cartoline virtuali - Calendari - Modelle - Playmates - Sfondi - Forum - Old SecurityNews - Warez