Wikibooks:Deposito/Moduli/Bourne Shell Scripting
Lo scripting di shell ha nei sistemi GNU/Linux e Unix una grandissima importanza. Quasi tutto ciò che avviene in una macchina *nix viene fatto con i cosiddetti script di bash.
I comandi
modificaI comandi sono tutte quelle "istruzioni" che ci permettono di interagire con un sistema operativo. Un comando di per se è un programma che può essere lanciato da noi manualmente, oppure da uno script. Solitamente i comandi vengono invocati, seguiti da un numero n di parametri o opzioni, che servono a modificarne il funzionamento. Come illustrato di seguito i comandi si dividono in Interni o Esterni alla shell. Un utile metodo per stabilire se un comando sia Interno o Esterno è il comando:
type nome_comando
Tramite questo comando sarà possibile stabilire se un dato comando sia incluso nella shell o sia esterno.
Interni a Bash
modificals
Questo comando permette l'elencazione del contenuto di una directory. Molto utile per alcuni tipi di script, ammette alcune opzioni molto utili . In particolare molto usate sono -l e -a che rispettivamente permettono di vedere tutte le caratteristiche dei dati contenuti nella cartella e di vedere anche i file nascosti relativi alla cartella.
cat
Con questo comando si può leggere il contenuto di un file di testo.
Programmi esterni
modificahead
Questo comando permette di vedere l'inizio di un file. Particolarmente utile è nello scripting con la opzione -n <numero> che indica quante righe mostrare
tail
Questo è il comando corrispondente a head che permette invece di visualizzare la fine dei file. La sua utilità è duplice. Può essere infatti usato come comando per lo scripting, anch'esso con la opzione -n <numero>, oppure come normale strumento di sistema. Può essere infatti a volte utile avere sempre sott'occhio i cambiamenti ad un file (tipicamente un log di sistema). In tal caso si può usare l'opzione -f <file>, che permette di mostrare in modo continuativo i cambiamenti e gli append al file.
ps
Questo programma permette di vedere quali sono i processi attivi e in corso. Viene generalmente usato con l'opzione -A, che permette di visualizzare tutti i processi attivi e non solo ps e il processo genitore bash.
grep
Potentissimo strumento per la selezione di pattern o semplici righe all'interno di un file.
Tecniche avanzate
modificaLeggere ciò che uno scrive
modificaUtlizzando il comando read sarà possibile creare un campo di inserimento, dove l'utilizzatore dello script potrà scrivere. Il risultato viene scritto su una variabile. Per esempio, metendo nello script read nome e in seguito echo $nome, il comando stamperà a schermo il suo nome. Per esempio:
echo "Di quale directory vuoi elencare i file?" read directory ls directory
Il risultato sarà l'elenco della directory inserita. Pensate a tutti gli usi che questo piccolo comando comporta...
Pipe
modificaMolte volte sarà utile inviare l’outpout di un comando ad un secondo. Per fare ciò,bisogna usare un particolare carattere: |,questo carattere si chiama pipe e, nella tastiera italiana, si trova sopra lo \. Esempio:
ls /etc | more
Questo comando fa visualizzare a more il risultato di ls /etc per poterlo scorrere con calma.
Reindirizzamento
modificaOgni programma presenta di default tre flussi di dati, o stream: uno di ingresso (STDIN), uno di uscita (STDOUT) e uno di errore (STDERR). Generalmente questi flussi di dati sono collegati rispettivamente alla tastiera (STDIN), al monitor (STDOUT e STDERR); ma nulla ci vieta di reindirizzare uno solo di questi flussi verso un file qualsiasi. Facciamo un esempio: ipotizziamo di voler indirizzare l'uscita (cioè il flusso di STDOUT) del comando ls al file pippo; per fare questo diamo il comando:
#ls > pippo
questo comando prenderà l'output di ls e lo inviarà al file pippo.
Il reindirizzamento dell'output (STDOUT) si ottiene con il simbolo '>'; quello dell'input (STDIN) con il simbolo '<' e quello del flusso di errore (STDERR) con il simbolo '2>'.
Uno dei tanti usi che si possono fare con questo comando è quello di unire due file, infatti battendo un cat file1.txt file2.txt > file3.txt otterremo un file (file3) che è l'unione di due file (file 1 e file 2).