La programmazione di script shell è come avere un assistente personale che non dorme mai, non si lamenta mai e esegue i tuoi comandi con precisione robotica. È l'arte di concatenare istruzioni da riga di comando per creare flussi di lavoro potenti e automatizzati.

Come può aiutarti la programmazione di script shell?

  • Automatizzare compiti ripetitivi (perché la vita è troppo breve per ctrl+C, ctrl+V)
  • Gestire i processi di sistema come un capo
  • Creare operazioni riproducibili (così il tuo futuro te stesso non maledirà il tuo passato)
  • Mostrare le tue abilità Linux e impressionare i tuoi colleghi

Prima di rimboccarci le maniche, chiariamo una cosa: stiamo parlando di Bash qui. Certo, ci sono altre shell come Zsh, Fish o il buon vecchio Sh, ma Bash è il ragazzo cool con cui tutti vogliono uscire nel parco giochi di Linux.

Il tuo primo incontro con la programmazione di script shell

Iniziamo con il classico "Ciao, Mondo!" perché, beh, è tradizione:

#!/bin/bash
echo "Ciao, Mondo! Sono uno script shell, piacere di conoscerti!"

Salva questo come ciao_mondo.sh e analizziamolo:

  • #!/bin/bash: Questo si chiama shebang. È come dire al computer, "Ehi, esegui questo con Bash, per favore!"
  • echo: Questo comando è come gridare nel vuoto, tranne che il vuoto è il tuo terminale.

Ora, rendiamolo eseguibile ed eseguiamolo:

chmod +x ciao_mondo.sh
./ciao_mondo.sh

Boom! Ora sei ufficialmente uno script shell. Mettilo nel tuo curriculum! 😄

Variabili: Il condimento della vita shell

Le variabili negli script shell sono come contenitori per le tue cose digitali. Giochiamo un po':

#!/bin/bash

# Assegna un valore a una variabile
saluto="Ciao, terrestre!"

# Usa la variabile
echo $saluto

# Ottieni input dall'utente
read -p "Come ti chiami? " nome
echo "Piacere di conoscerti, $nome!"

Consiglio da professionista: Quando usi le variabili, racchiudile tra parentesi graffe come ${variabile} per evitare ambiguità. Il tuo futuro te stesso ti ringrazierà.

Strutture di controllo: Piegare la shell alla tua volontà

Ora, aggiungiamo un po' di logica ai nostri script. Inizieremo con la struttura if-then-else, il pane e burro delle decisioni:

#!/bin/bash

read -p "Inserisci un numero: " num

if [ $num -gt 10 ]; then
    echo "È un numero grande!"
elif [ $num -eq 10 ]; then
    echo "Hai centrato il punto giusto!"
else
    echo "Pensa più in grande!"
fi

Ecco un ciclo per farti sentire come se fossi in The Matrix:

#!/bin/bash

for i in {1..5}
do
    echo "Iterazione $i"
    sleep 1  # Pausa per effetto drammatico
done

echo "Ciclo completato. Mente = Sconvolta."

Operazioni sui file: Perché i dati non si spostano da soli

Creiamo uno script che esegue il backup di un file e aggiunge un timestamp:

#!/bin/bash

# Controlla se è stato fornito un nome file
if [ $# -eq 0 ]; then
    echo "Uso: $0 "
    exit 1
fi

filename=$1
timestamp=$(date +"%Y%m%d_%H%M%S")
backup_file="${filename}_${timestamp}.bak"

# Controlla se il file esiste
if [ ! -f "$filename" ]; then
    echo "Errore: File '$filename' non trovato."
    exit 1
fi

# Crea il backup
cp "$filename" "$backup_file"

if [ $? -eq 0 ]; then
    echo "Backup creato con successo: $backup_file"
else
    echo "Errore: Backup fallito."
fi

Questo script introduce alcuni nuovi concetti:

  • $#: Il numero di argomenti passati allo script
  • $1: Il primo argomento passato allo script
  • $(command): Sostituzione di comando - esegue un comando e restituisce l'output
  • $?: Lo stato di uscita dell'ultimo comando (0 significa successo)

Gestione degli errori: Perché gli errori accadono

Aggiorniamo il nostro script con un po' di gestione degli errori:

#!/bin/bash

set -e  # Esci immediatamente se un comando termina con uno stato diverso da zero
set -u  # Tratta le variabili non impostate come un errore

log_error() {
    echo "ERRORE: $1" >&2
}

backup_file() {
    local filename=$1
    local backup_dir="/tmp/backups"

    # Crea la directory di backup se non esiste
    mkdir -p "$backup_dir" || { log_error "Impossibile creare la directory di backup"; return 1; }

    # Copia il file nella directory di backup
    cp "$filename" "$backup_dir" || { log_error "Impossibile copiare il file"; return 1; }

    echo "Backup di $filename creato in $backup_dir"
}

# Esecuzione principale dello script
main() {
    if [ $# -eq 0 ]; then
        log_error "Uso: $0 "
        exit 1
    fi

    backup_file "$1"
}

main "$@"

Questo script introduce:

  • set -e e set -u per un controllo degli errori più rigoroso
  • Una funzione per la registrazione degli errori
  • Una funzione principale per organizzare la logica dello script

Tecniche avanzate: Migliora il tuo gioco con la shell

Ora che abbiamo coperto le basi, diamo un'occhiata ad alcune tecniche più avanzate:

1. Uso degli array

#!/bin/bash

# Dichiarare un array
frutti=("mela" "banana" "ciliegia")

# Ciclo attraverso l'array
for frutto in "${frutti[@]}"
do
    echo "Mi piace $frutto"
done

# Aggiungi un elemento all'array
frutti+=("dattero")

# Stampa l'intero array
echo "Tutti i frutti: ${frutti[*]}"

2. Funzione con valori di ritorno

#!/bin/bash

is_even() {
    if [ $(($1 % 2)) -eq 0 ]; then
        return 0  # Vero (in bash, 0 è vero)
    else
        return 1  # Falso
    fi
}

numero=42
if is_even $numero; then
    echo "$numero è pari"
else
    echo "$numero è dispari"
fi

3. Lettura da un file

#!/bin/bash

filename="sample.txt"

while IFS= read -r line
do
    echo "Linea: $line"
done < "$filename"

Best Practices: Non spararti sui piedi

  • Usa sempre set -e e set -u all'inizio dei tuoi script
  • Cita le tue variabili: "$variabile" invece di $variabile
  • Usa variabili local nelle funzioni per evitare di inquinare lo spazio dei nomi globale
  • Commenta il tuo codice (il tuo futuro te stesso ti ringrazierà)
  • Usa nomi significativi per variabili e funzioni
  • Testa i tuoi script a fondo, specialmente i casi limite

Errori comuni: Impara dagli errori degli altri

  • Dimenticare di rendere eseguibile il tuo script (chmod +x script.sh)
  • Usare == invece di = per il confronto di stringhe nelle parentesi test
  • Non gestire gli spazi nei nomi dei file (usa le virgolette!)
  • Supporre che un comando sia riuscito senza controllare il suo stato di uscita

Conclusione: La shell e oltre

Congratulazioni! Hai fatto i tuoi primi passi nel potente mondo della programmazione di script shell. Con queste abilità, sei ben avviato per automatizzare compiti, gestire sistemi e diventare un ninja della riga di comando.

Ricorda, la programmazione di script shell è solo l'inizio. Man mano che diventi più a tuo agio, potresti voler esplorare:

  • Elaborazione di testo più avanzata con awk e sed
  • Pianificare i tuoi script con cron
  • Controllare le versioni dei tuoi script con Git
  • Integrare i tuoi script con altri strumenti e servizi

Continua a sperimentare, continua a imparare e, soprattutto, continua a scrivere script! La riga di comando è la tua ostrica e hai gli strumenti per aprirla.

"La differenza tra un buon amministratore e un grande amministratore è di circa 40 script shell." - Sconosciuto

Ora vai avanti e automatizza tutto! 🚀