Shell e scripting

utilizzo della shell

strumento potente

permette di facilitare l'esecuzione di compiti ripetitivi

varie alternative

sh

bash

(perl)

caratteri speciali

carattery jolly: * ? [ ]

background: &

separatore comandi: ;

stringa letterale: '

stringa con gestione variabili: “

variabili: $

acceleratore: !

gestione output: `

redirezioni: > < |

sequenza di escape: \

metacaratteri

detti anche caratteri jolly

permettono di rappresentare altri caratteri o gruppi di caratteri

*: corrisponde a 0 o piú caratteri qualsiasi

?: corrisponde ad 1 carattere qualsiasi

[]: permettono di definire meglio la corrispondenza

espansi dalla shell (differenza con DOS)

\ per il significato letterale

esecuzione in background

solo per programmi non interattivi

permette di liberare il terminale

si termina il comando con &

attenzione ad HUP

nohup

Redirezionamento

sh, bash e ksh

stdout > |

stderr 2>

&1 alias stdout

>& o &> bash

>> append

(t)csh

stdout > |

stderr >& |&

>> append

! dipende dalle impostazioni

Permette di gestire l'output dei programmi

Dipende fortemente dalla shell

grep amministrazione < ce_full.log | grep -v forum | awk '{print $1}'|sort|uniq|wc -l

Output come argomento

tramite “`” è possibile catturare l'output di un programma

which ls

ls -l `!!`

banner `date|cut -c12-19`

shell script

possibilità di creare script complessi

quale shell usare?

sh (default e nostro riferimento)

bash

(t)csh (evitare!)

perl

#!

variabili

carattere $

argomenti:

comando: $0

argomenti posizionali: $1 - $n

numero argomenti: $#

tutti gli argomenti: $*

variabili con nome

var1=... (attenzione agli spazi)

export var1

read

codice di ritorno: $? -> exit

ciclo for

for variabile<CR>

in lista-valori<CR>

do<CR>

comando 1<CR>

comando 2<CR>

...

done<CR>

ciclo while

while<CR>

comando1<CR>

comando2<CR>

...<CR>

do<CR>

comando 1a<CR>

comando 2a<CR>

...

done<CR>

if then else

if<CR>

comando1<CR>

...<CR>

then<CR>

comando 1a<CR>

...

else<CR>

comando 1b<CR>

...

fi<CR>

test

utile in accoppiata con if

test -r <file>

test -w <file>

test -x <file>

test -s <file>

test var1 -eq var2

...

sostituibile con [ ] (attenzione agli spazi)

funzioni

sintassi semplice

nomefunzione () {

corpofunzione

}

si invocano con

nomefunzione

espressioni

expr

sia espressioni logiche che matematiche

expr 1 + 2

expr $a + $b

debug

errori di interpretazione

echo

opzione -x

comandi utili

awk

sed

tr

grep

...

awk

sistema per l'analisi di informazioni testuali

analisi di linee

ricerca sequenze

sequenza – azione

awk <opzioni sequenza-azione> <input>

;

cat /etc/shadow | awk -F: '{print $1, $2}'

awk – azioni di output

legge una riga (record) per volta $0

divisione in campi $1, $2, ..., $n

spazio come separatore predefinito

comandi di output

print <espr1>,<espr2>,...

printf <formato>,<espr1>,<espr2>,...

awk - sequenze

operatori ==, >, <,...

espressioni regolari tra / /

operatori ~ e !~

operatori logici && ||

sequenze speciali BEGIN END

intervalli di sequenze

awk -F: 'BEGIN {print “UTENTI ATTIVI\n”> “l.txt”} \

$2 !~ ”@” {print $1>” l.txt”}' /etc/passwd

awk – variabili

NR numero di linea di input

NF numero di campi

possibile definirne di proprie

awk – funzioni avanzate

funzioni predefinite

costrutti per il controllo di flusso

funzioni definite dall'utente

array

output su file

l'editor sed

editor non interattivo di riga

da stdin o file a stdout

operazioni comuni

sostituisci -> sed 's/2004/2005/' < /tmp/listino.txt

g per globale

d cancella -> sed '/^$/d' /tmp/testo.txt

p stampa -> sed '/Costo/p' < /tmp/fatture.txt

altri esempi sed

8d	Cancella l'ottava riga dell'input.

/^$/d	Cancella tutte le righe vuote.

1,/^$/d	Cancella dall'inizio dell'input fino alla prima riga vuota compresa.

/Jones/p	Visualizza solo le righe in cui è presente "Jones" (con l'opzione -n).

s/Windows/Linux/	Sostituisce con "Linux" la prima occorrenza di "Windows" trovata in ogni riga dell'input.

s/BSOD/stabilità/g Sostituisce con "stabilità" tutte le occorrenze di "BSOD" trovate in ogni riga dell'input.

s/ *$//	Cancella tutti gli spazi che si trovano alla fine di ogni riga.

s/00*/0/g	Riduce ogni sequenza consecutiva di zeri ad un unico zero.

/GUI/d	Cancella tutte le righe in cui è presente "GUI".

s/GUI//g	Cancella tutte le occorrenze di "GUI", lasciando inalterata la parte restante di ciascuna riga.

2000-10-18T12:27:40