scripting - esecuzione condizionale - costrutti iterativi - variabili (quoting, espansione)

65

Upload: fulvio-corno

Post on 02-Jul-2015

198 views

Category:

Education


0 download

DESCRIPTION

Master: Amministratore Linux - Livello Base Nel contesto della formazione professionale rivolta ad aziende ed enti pubblici, sono stati preparati ed erogati dei corsi di Amministratore di sistemi Linux, al livello base ed al livello avanzato. Il contenuto del corso è allineato con alcuni moduli della certificazione LPIC (Linux Professional Institute Certification), a cavallo tra i livelli 1 e 2. Tutto il materiale didattico è disponibile liberamente con licenza Creative Commons BY-NC-SA. I docenti del corso sono i proff. Giovanni Squillero, Bartolomeo Montrucchio e Fulvio Corno. Maggiori informazioni: http://elite.polito.it/index.php/teaching/current-courses/255-master-linux-admin

TRANSCRIPT

Page 1: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)
Page 2: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

“… a strange language, shaped as much

by history as by design” — Kernigham & Pike

Percorso 5 Bash script 2

Page 3: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Il primo script

Percorso 5 Bash script 3

Page 4: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esecuzione

Percorso 5 Bash script 4

Page 5: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Variabili

# la variabile FOO è «locale»

FOO=23

# la variabile FOO è esportata negli ambienti

#+ dei processi figli

export FOO=10

# rimuove l’ambiguità (se serve)

echo ${FOO}BAR

Percorso 5 Bash script 5

Page 6: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Variabili speciali

$RANDOM

– un numero casuale

Percorso 5 Bash script 6

Page 7: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Variabili speciali

$BASH

$BASHPID

$BASHOPTS

$BASH_VERSION

– informazioni sulla bash

Percorso 5 Bash script 7

Page 8: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Variabili speciali

$USER

$GROUPS

– informazioni sull’utente

Percorso 5 Bash script 8

Page 9: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

$PATH

• La shell cerca i comandi all’interno del $PATH

• La cartella corrente «.» non fa parte del path

– e non è prudente aggiungerla

• È possibile aggiungere le proprie cartelle al $PATH

– nel dubbio: aggiungere sempre alla fine

Percorso 5 Bash script 9

PATH=$PATH:$HOME/scripts

echo $PATH

Page 10: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Argomenti e Variabili speciali

$*

$@

– gli argomenti dello script (tutti insieme)

– $* è equivalente a $@

– "$*" non è equivalente a "$@"

$#

– numero di argomenti

Percorso 5 Bash script 10

Page 11: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Argomenti

$0

– il nome dello script

$1 … $n

– il primo, …, n-esimo argomento dello script

– è necessario usare ${10} se n ≥ 10

shift

– cancella $1 e sposta ogni ${n} in ${n-1}

Percorso 5 Bash script 11

Page 12: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Il primo script (v2)

Percorso 5 Bash script 12

sha bang

Page 13: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esercizio

• Scrivere lo script «hello» che stampa a video il nome dell’utente

• Creare la cartella etc nella home, aggiungerla al PATH, ed eseguire lo script

Percorso 5 Bash script 13

$ hello

Ciao giovanni

Page 14: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Informazioni sul processo

$$

– il PID corrente

$UID / $GID

– l’UID / il GID corrente

Percorso 5 Bash script 14

Page 15: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Test

$?

– il valore di ritorno (exit code) dell’ultimo comando

– Convenzione

• zero: tutto ok

• maggiore di zero: problemi

Percorso 5 Bash script 15

Page 16: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Test

• Il comando «test» valuta l’espressione specificata e ne restituisce il valore (0 per vero, 1 falso)

• «[ expr ]» è equivalente a «test expr»

– «[» è un comando builtin

– ma esiste anche il file eseguibile /usr/bin/[

• Attenzione: «3 = 3» è un confronto fra parole, non numeri

Percorso 5 Bash script 16

Page 17: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Controlli principali

-f foo foo esiste ed è un file

-d foo foo esiste ed è una cartella

Usare «man test» per l’elenco completo dei controlli

Percorso 5 Bash script 17

Page 18: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Controlli principali

s1 = s2 la stringa s1 è uguale a s2

s1 != s2 la stringa s1 è diversa da s2

Percorso 5 Bash script 18

Page 19: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Controlli principali

n1 -eq n2 il numero n1 è uguale a n2

n1 -ne n2 il numero n1 è diverso da n2

n1 -ge n2 il numero n1 è maggiore o uguale a n2

n1 -gt n2 il numero n1 è maggiore di n2

n1 -le n2 il numero n1 è minore o uguale a n2

n1 -lt n2 il numero n1 è minore di n2

Percorso 5 Bash script 19

Page 20: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

[ exp ] vs. [[ exp ]]

• [[ exp ]] valuta l’espressione come [ exp ]

• [[ … ]] è una keyword della shell, non è un comando (interno o esterno)

– maggiore versatilità

– test più potenti

– non del tutto standard

Percorso 5 Bash script 20

Page 21: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esecuzione condizionale

if espressione

then

lista comandi

elif espressione

lista comandi

elif espressione

lista comandi

else

lista comandi

fi

Percorso 5 Bash script 21

Page 22: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esecuzione condizionale

Percorso 5 Bash script 22

Page 23: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Hacks

• Il comando viene eseguito se expr è vera

• Il comando viene eseguito se expr è falsa

Percorso 5 Bash script 23

expr && comando

expr || comando

Page 24: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esercizio

• Scrivere uno script per controllare che tutti gli argomenti siano tutti file esistenti ed eseguibili

• In caso negativo, stampare l’elenco dei parametri non corretti spigando le ragioni

Percorso 5 Bash script 24

$ ./script.sh foo script.sh bar.txt

foo: file non trovato

bar.txt: file non eseguibile

Page 25: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Alternative

case parola in

pat1) comandi ;;

pat2) comandi ;;

*) comandi default ;;

esac

Percorso 5 Bash script 25

Page 26: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Alternative

Percorso 5 Bash script 26

Page 27: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Espansione intera

• L’espressione dentro (( … )) viene considerata una «espressione intera» e valutata di conseguenza

• in (( … )) si possono usare: == != > >= < <= …

Percorso 5 Bash script 27

(( A = 12 + 45 ))

B=$(( A + 5 ))

if (( A >= 23 )); then

echo YES

fi

Page 28: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Costrutti iterativi

while espressione

do

lista comandi

done

Percorso 5 Bash script 28

until espressione

do

lista comandi

done

Page 29: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Costrutti iterativi

Percorso 5 Bash script 29

Page 30: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

break/continue

while espressione

do

lista comandi

expr1 && break

lista comandi

expr2 || continue

lista comandi

done

Percorso 5 Bash script 30

Page 31: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Costrutti iterativi

for var in list

do

lista comandi

done

Percorso 5 Bash script 31

Page 32: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Costrutti iterativi

Percorso 5 Bash script 32

Page 33: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

printf

• Per chi ha familiarità con il C, la bash mette a disposizione la printf

• Può essere utilizzata per definire variabili

Percorso 5 Bash script 33

printf "Formattato: %3d\n" 23

printf -v FOO "Formattato: %3d\n" 23

Page 34: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Command substitution

• L’output di un comando può essere utilizzato come fosse una stringa (ad esempio assegnato ad una variabile)

Percorso 5 Bash script 34

DIR=$( ls / )

echo $DIR

MSG=`echo "La vecchia Bourne shell"`

echo $MSG

Page 35: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esercizio

• Scrivere lo script bar.sh che conta il numero di righe dei file passati come argomento e stampa una barra composta da hash ‘#’, una ogni 10 righe

• Problemi

– come contare le linee di un file ed assegnare il valore ad una variabile?

Percorso 5 Bash script 35

Page 36: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Quoting

• Il tasto racchiuso fra apici doppi viene visto come un singolo argomento, le variabili sono espanse

• Il tasto racchiuso fra apici singoli viene visto come un singolo argomento, le variabili non sono espanse

• Il tasto backslash «\» (escape) cambia il significato del carattere che segue

Percorso 5 Bash script 36

Page 37: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Quoting

Percorso 5 Bash script 37

Page 38: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

$* vs. $@

• Se non racchiusi fra doppi apici

– equivalenti

• Se racchiusi fra doppi apici • "$*" è espanso in una unica stringa

• "$@" è espanso nei singoli argomenti

• Suggerimento: usate sempre $@

• NB: ci sono altre differenze (vedi $IFS)

Percorso 5 Bash script 38

Page 39: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

$* vs. $@

Percorso 5 Bash script 39

Page 40: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

$* vs. $@

Percorso 5 Bash script 40

Page 41: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Espansioni

Percorso 5 Bash script 41

Page 42: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esercizio

• Scrivere lo script args.sh utilizzato negli esempi

Percorso 5 Bash script 42

Page 43: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Valori di default delle variabili

${VAR-valore}

– usa valore se non definita

${VAR:-valore}

– # usa valore se non definita o vuota

Percorso 5 Bash script 43

Page 44: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Valori di default delle variabili

Percorso 5 Bash script 44

Page 45: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Default + Assegnazione

${VAR=valore}

– sostituisce ed espande se non definita

${VAR:=valore}

– sostituisce ed espande se non definita o vuota

Percorso 5 Bash script 45

Page 46: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Valori alternativi delle variabili

${VAR+valore}

– usa valore se definita (anche se vuota)

${VAR:+valore}

– usa valore se definita e non vuota

Percorso 5 Bash script 46

Page 47: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Valori alternativi delle variabili

Percorso 5 Bash script 47

Page 48: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Messaggi di errore

${VAR?messaggio}

– mostra un messaggio di errore ed interrompe lo script (restituisce 1) se la variabile non è definita

${VAR:?valore}

– mostra un messaggio di errore ed interrompe lo script (restituisce 1) se la variabile non è definita o è vuota

Percorso 5 Bash script 48

Page 49: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Pattern

${var%PATTERN}

– rimuove il più piccolo pattern dalla fine

${var%%PATTERN}

– rimuove il più lungo pattern dalla fine

Percorso 5 Bash script 49

Page 50: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Pattern

${var#PATTERN}

– rimuove il più piccolo pattern dall’inizio

${var##PATTERN}

– rimuove il più lungo pattern dall’inizio

Percorso 5 Bash script 50

Page 51: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Pattern

${var//tro/sos}

– sostituisce tutte le occorrenze di «tro» con «sos»

Percorso 5 Bash script 51

Page 52: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Pattern

${var:start[:num]}

– restituisce una sottostringa

Percorso 5 Bash script 52

Page 53: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Riferimento indiretto

${!VAR}

– il valore della variabile il cui nome è memorizza nella variabile VAR

Percorso 5 Bash script 53

Page 54: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Array

# inizializzazione

ARRAY=(23 10)

# elementi dell’ array

ARRAY[0]=23

ARRAY[1]=10

echo ${ARRAY[1]}

Percorso 5 Bash script 54

Page 55: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Array

# array completo

echo ${ARRAY[*]}

echo ${ARRAY[@]}

# numero elementi

echo ${#ARRAY[@]}

Percorso 5 Bash script 55

Page 56: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Array

• Nessun indice è equivalente all’indice 0

– $ARRAY equivale a ${ARRAY[0]}

Percorso 5 Bash script 56

Page 57: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Array (* vs. @)

Percorso 5 Bash script 57

Page 58: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Array (* vs. @)

Percorso 5 Bash script 58

Page 59: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Percorso 5 Bash script 59

Page 60: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Input

read var1 [… varN]

– legge dallo stdin ed assegna le variabili

– comando interno

– alla prima variabile viene assegnata la prima parola, alla seconda la seconda, …, all’ultima il resto della riga

Percorso 5 Bash script 60

Page 61: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Input

read var1 [… varN]

– è possibile usare la redirezione

– read è un espressione vera se ha assegnato le variabili

Percorso 5 Bash script 61

Control+D

Page 62: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Lettura da file

Percorso 5 Bash script 62

Page 63: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esecuzione automatica

~/.bash_profile

– Eseguito dalla bash quando l’utente si collega alla macchina la prima volta (login)

~/.profile

– Eseguito dalla sh quando l’utente si collega alla macchina la prima volta (login)

– Eseguito da bash solo se .bash_profile manca

~/.bashrc

– Eseguito quando l’utente apre un terminale

Percorso 5 Bash script 63

Page 64: Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoting, espansione)

Esercizio

• Modificare .bash_profile e .bashrc facendo stampare due messaggi diversi

• Fare in modo che .bash_profile esegua sempre anche .bashrc

• Suggerimenti [[ -f .bashrc ]] && source .bashrc

usare «bash -l» per lanciare una bash di login, «ps --forest» per verificare

Percorso 5 Bash script 64