1 of 34

B - Il Sistema Operativo

ES08 - Controllo remoto versione base

FB - 05.2026 - v1.6

“La teoria è quando si sa tutto e niente funziona. La pratica è quando tutto funziona e nessuno sa il perché. Noi abbiamo messo insieme la teoria e la pratica: non c'è niente che funzioni… e nessuno sa il perché!”

2 of 34

Controllo Remoto

Esercitazione per il controllo remoto di dispositivi tramite script bash con la Raspberry PI

2

© FB - 10.2025

3 of 34

Indice

3

© FB - 10.2025

4 of 34

Obiettivi didattici

4

5 of 34

Obiettivi didattici

  • Imparare l’utilizzo dei comandi: wget, sleep
  • Utilizzo delle funzioni
  • Documentazione tecnica dei lavori

5

© FB - 10.2025

6 of 34

Introduzione teorica

6

7 of 34

Le funzioni

7

© FB - 02.2024

8 of 34

Le funzioni

Le funzioni in Bash sono blocchi di codice riutilizzabili che eseguono specifiche operazioni quando vengono chiamate. Le funzioni rendono più modulare e organizzato il codice Bash, consentendo di suddividere compiti complessi in sotto-task più gestibili. Ecco la sintassi di base per definire una funzione in uno script Bash:

nome_funzione() {

# Corpo della funzione

# Comandi da eseguire quando la funzione viene chiamata

}

Ecco un esempio semplice di definizione e chiamata di una funzione:

#!/bin/bash

# Definizione di una funzione

saluta() {

echo "Ciao, benvenuto!"

}

# Chiamata della funzione

saluta

8

© FB - 02.2024

9 of 34

Le funzioni

In Bash, le funzioni possono accettare argomenti, proprio come gli script Bash possono accettare argomenti da riga di comando. Gli argomenti passati a una funzione in Bash sono chiamati "parametri della funzione". Questi parametri vengono passati alla funzione nello stesso modo degli argomenti passati agli script Bash.

Puoi accedere agli argomenti all'interno della funzione utilizzando le variabili speciali $1, $2, $3, ecc., che corrispondono ai primi, secondi, terzi argomenti, e così via. Ecco un esempio di funzione che accetta argomenti:

#!/bin/bash

# Definizione di una funzione che accetta argomenti

saluta_persona() {

echo "Ciao, $1! Benvenuto in Bash."

}

# Chiamata della funzione con un argomento

saluta_persona "Giovanni"

In questo esempio, la funzione saluta_persona prende un argomento (il nome della persona da salutare) e lo utilizza all'interno del messaggio di saluto.

Le funzioni possono essere posizionate ovunque nello script e possono essere chiamate da qualsiasi parte dello script dopo essere state definite. Le funzioni possono anche restituire valori utilizzando return.

9

© FB - 02.2024

10 of 34

Le funzioni

Lettura di variabili esterne: Le funzioni possono leggere le variabili definite al di fuori di esse senza doverle passare come argomenti. Le variabili globali sono accessibili all'interno delle funzioni.

mia_variabile="valore esterno"

function mia_funzione {

echo "Valore esterno: $mia_variabile"

}

mia_funzione

Scrittura di variabili esterne: Le funzioni possono scrivere direttamente su variabili globali.

mia_variabile="valore esterno"

function mia_funzione {

mia_variabile="nuovo valore"

}

echo "Prima della chiamata: $mia_variabile"

mia_funzione

echo "Dopo la chiamata: $mia_variabile"

10

© FB - 02.2024

11 of 34

Le funzioni

Utilizzo di variabili locali: la parola chiave local viene utilizzata per dichiarare variabili locali all'interno di una funzione. Le variabili definite come locali sono accessibili solo all'interno della funzione stessa e non vengono propagate al di fuori della funzione. Questo è particolarmente utile per evitare che le variabili definite all'interno di una funzione entrino in conflitto con variabili globali o con lo stesso nome definite in altre funzioni.

mia_variabile="valore esterno"

function mia_funzione {

local mia_variabile="valore interno"

echo "Dentro la funzione: $mia_variabile"

}

mia_funzione

echo "Fuori dalla funzione: $mia_variabile"

funzione_test() {

# Definizione di variabile locale

local variabile_locale="Valore locale"

# Stampare il valore della variabile locale

echo "Variabile locale all'interno della funzione: $variabile_locale"

}

# Chiamata alla funzione

funzione_test

# Tentativo di accedere alla variabile locale al di fuori della funzione

echo "Variabile locale al di fuori della funzione: $variabile_locale"

11

© FB - 02.2024

12 of 34

Restituzione di valori con le funzioni

In Bash, le funzioni possono restituire valori attraverso il meccanismo dell'exit status e attraverso la stampa dei valori nell'output standard. Tuttavia, Bash non supporta il concetto di un valore di ritorno di una funzione come altri linguaggi di programmazione. Di seguito sono descritti i metodi comuni per restituire valori dalle funzioni Bash:

Exit Status:

Le funzioni in Bash restituiscono un exit status che indica se la funzione è stata eseguita con successo o se è fallita. Un exit status di 0 indica successo, mentre un valore diverso da 0 indica un fallimento. Puoi impostare manualmente l'exit status utilizzando il comando return all'interno della funzione. Ad esempio:

function mia_funzione {

# Fai qualcosa

return 5

}

mia_funzione

echo $? #stampa 5

Output Standard:

Le funzioni in Bash possono stampare valori nell'output standard utilizzando echo, printf o altri comandi di stampa. Questi valori possono essere catturati e assegnati a variabili al di fuori della funzione utilizzando la sostituzione di comando. Ad esempio:

function mia_funzione {

echo "Valore restituito"

}

# Chiamata alla funzione e cattura dell'output

risultato=$(mia_funzione)

echo $risultato #stamperà Valore restituito

12

© FB - 02.2024

13 of 34

wget

13

© FB - 02.2024

14 of 34

wget

Il comando wget è un'utilità di linea di comando che consente di scaricare file da Internet utilizzando il protocollo HTTP, HTTPS e FTP. È ampiamente utilizzato su sistemi Unix-like, inclusi Linux e macOS. Ecco una sintassi di base per utilizzare il comando wget:

wget [opzioni] [URL]

Dove [opzioni] sono le opzioni che è possibile specificare per personalizzare il comportamento di wget, e [URL] è l'indirizzo URL del file che si desidera scaricare. Alcune delle opzioni comuni includono:

  • -O <nomefile>: Specifica il nome del file in cui salvare il download.
  • -P <cartella>: Specifica la cartella in cui salvare il file scaricato.
  • -q (o --quiet): Modalità silenziosa, non stampa output di stato.
  • -c (o --continue): Riprendi un download interrotto.
  • -r (o --recursive): Scarica ricorsivamente, ad esempio per scaricare un'intera struttura di directory.

14

© FB - 02.2024

15 of 34

wget

Esempio di utilizzo wget per controllare la connessione ad Internet

# il comando wget --spider restituisce 0 se il collegamento è attivo

# l'opzione -q serve per non stampare a video il risultato

wget -q --spider http://google.com

if [ $? -eq 0 ]; then

echo "Collegamento a Internet attivo"

fi

Ecco un esempio di come usare wget per scaricare un file e assegnargli un nome:

RMT_FILE_ACCENDI="https://raw.githubusercontent.com/filippo-bilardo/TPSIT_1/main/ES04/accendi"

LCL_FILE_ACCENDI="accendi"

wget $RMT_FILE_ACCENDI -O $LCL_FILE_ACCENDI

15

© FB - 02.2024

16 of 34

sleep

16

© FB - 02.2024

17 of 34

sleep

Il comando sleep è un'utilità di linea di comando utilizzata per mettere in pausa l'esecuzione di uno script o di un programma per un determinato periodo di tempo. È utile quando si desidera aggiungere un ritardo o una pausa tra le istruzioni all'interno di uno script Bash o di un'altra shell.

La sintassi di base del comando sleep è la seguente:

sleep <durata>

Dove <durata> rappresenta il periodo di tempo per cui si desidera mettere in pausa l'esecuzione dello script, espressa in secondi per impostazione predefinita.

Ecco alcuni esempi di come utilizzare il comando sleep:

sleep 5 //Mette in pausa l'esecuzione per 5 secondi

sleep 60 //Mette in pausa l'esecuzione per 1 minuto (60 secondi)

17

© FB - 02.2024

18 of 34

Approfondimenti

18

© FB - 02.2024

19 of 34

Approfondimenti

  • Le funzioni

19

© FB - 05.2026

20 of 34

Esercitazione

20

21 of 34

Esercizio a�Controllo remoto semplice

21

© FB - 10.2025

22 of 34

Controllo remoto semplice

Scrivere uno script che controlli la presenza del file “accendi” o del file “spegni” su di un server remoto (GitHub, Dropbox,...). In base al file presente eseguire il comando remoto corrispondente, che può essere simulato con l’accensione o lo spegnimento di una lampada collegata alla Raspberry PI oppure stampando a schermo l’operazione che si intende eseguire.

22

© FB - 02.2022

23 of 34

Procedura

  • Creare la cartella “es08_ControlloRemoto” e al suo interno il file ControlloRemoto_v10.sh
  • Creare un documento con Google Documenti dove inserire le seguenti fasi del progetto: titolo, obiettivo, introduzione teorica (elencare i soli comandi utilizzati), specifiche, diagrammi di flusso, il codice bash, specifiche di collaudo e collaudo. Seguire la guida La documentazione tecnica
  • inserire l’intestazione all’inizio dello script seguendo le convenzioni di scrittura di codice bash nei sistemi embedded

23

© FB - 02.2024

24 of 34

Esercizio b

24

© FB - 10.2025

25 of 34

Loop infinito

Modificare il precedente script in modo che il nostro sistema embedded (Linux), rimanga sempre in esecuzione controllando ed eseguendo periodicamente (ogni 30 sec) i comandi prelevati dal server remoto.

25

© FB - 10.2025

26 of 34

Esercizio c

26

© FB - 10.2025

27 of 34

Loop infinito

Organizzare il precedente programma utilizzando le funzioni da richiamare poi nel main:

  • Controllare con il comando wget --spider http://google.com la presenza di connessione ad Internet. In caso di mancata connessione visualizzare un messaggio di errore, ignorare il codice successivo
  • Provare a scaricare i file remoti accendi e spegni se presenti
  • Funzione per eseguire i comandi remoti. Se i file remoti sono presenti localmente significa che sono stati scaricati e bisogna eseguire quindi il comando corrispondente.

27

© FB - 10.2025

28 of 34

Esercizio d

Prima di completare il programma completo, scrivere e testare (singolarmente) le seguenti funzioni:

  1. check_connection: controlla la presenza di connessione alla rete Internet (usando il comando wget --spider, l’ exit status, …) e visualizza un messaggio coerente
  2. download_remote: scarica su disco un file presente su di un server remoto (ad esempio: https://raw.githubusercontent.com/filippo-bilardo/TPSIT_1/main/ES04/accendi ) assegnandogli un nome scelto da noi
  3. download_remote (parametri file_remoto, file_locale): scarica su disco il file “file_remoto” presente su di un server remoto assegnandogli un nome “file_locale”
  4. check_file: verifica la presenza di un file presente su disco e visualizzazione di un messaggio coerente
  5. check_file (parametri local_file): verifica la presenza di un file “local_file” presente su disco e visualizzazione di un messaggio coerente
  6. creare uno script che stampi all’infinito (ciclo while) un messaggio ogni 3 sec (CTRL+C per terminare lo script)
  7. creare uno script che stampi all’infinito (ciclo while) un messaggio ogni 3 sec (CTRL+C per terminare lo script) ma termini il programma se trova su disco il file “local_file”

28

© FB - 03.2024

29 of 34

Esercizio d

29

© FB - 03.2024

30 of 34

Valutazione

30

31 of 34

Griglia di valutazione

Si ricorda l’importanza di svolgere e consegnare i progetti assegnati.

31

© FB - 10.2025

32 of 34

Grazie per l’attenzione

33 of 34

Link/Riferimenti

33

© FB - 10.2025

34 of 34

Revisioni

v1.0 09/01/20 - Versione iniziale�v1.1 06/02/20 - Esecuzione di comandi multipli�v1.2 06/05/20 - Le funzioni, maggiore dettaglio dell’esercitazione�v1.3 16/02/22 - tolta la parte sul gpio spiegata nella precedente esercitazione�v1.4 08/01/24 - Ampliata l’introduzione teorica�v1.5 18/5/26 - Aggiunti approfondimenti e rivisti gli esercizi

34