Questo tutorial tratta di come puoi facilmente scrivere i tuoi script Bash su Linux.

Come amministratore di sistema, è molto probabile che tu stia eseguendo compiti ripetitivi che potrebbero essere automatizzati.

Per tua fortuna, c’è un linguaggio di programmazione che può essere usato su Linux per scrivere script: il linguaggio di programmazione Bash.

Utilizzando Bash, puoi programmare interi backup di sistema specificando tutti i comandi che vuoi negli script Bash.

Puoi anche avere script personalizzati che creano ed eliminano utenti e rimuovono i loro file associati.

Con Bash, puoi anche avere script in esecuzione e scaricare utili metriche di performance in un file o in un database.

Bash è un linguaggio di programmazione molto potente per gli amministratori di sistema.

Nel tutorial di oggi, impareremo tutte le basi che c’è da sapere su Bash: come creare ed eseguire script, come usare variabili e shell built-ins efficacemente.

Tabella dei contenuti

Cosa imparerai

Se leggerai questo tutorial fino alla fine, imparerai i seguenti concetti riguardanti Bash

  • Come creare ed eseguire script Bash usando la riga di comando;
  • Cos’è shebang e come viene usato da Linux per lo scripting;
  • Cosa sono le shell built-ins e come differiscono dai normali programmi di sistema;
  • Come usare le variabili Bash e cosa sono le variabili speciali;
  • Come usare la sostituzione dei comandi Bash;
  • Come usare semplici istruzioni IF su Bash;

Come potete vedere, questo è un programma piuttosto lungo, quindi senza ulteriori indugi, iniziamo a vedere come potete creare ed eseguire script Bash.

Iniziare con Bash

Prima di emettere qualsiasi comando, facciamo una breve descrizione di Bash e della storia comune della Shell.

Storia di Bash

La prima versione della shell Bash fu rilasciata nel 1989 da Brian Fox ed è un’implementazione open-source della shell Unix.

All’epoca, quando i sistemi Unix iniziarono a sorgere, tali sistemi usavano shell Unix standard chiamate Bourne shell.

Imagine da LinuxJournal

Nei primi giorni di Unix, i sistemi sviluppati da aziende come il MIT o i Bell Labs non erano liberi e non erano open-source.

Anche se veniva fornita la documentazione per quegli strumenti, divenne una priorità per l’iniziativa GNU (guidata da Richard Stallman) avere la propria versione della Shell Unix.

Sei anni dopo l’annuncio del progetto GNU, nacque la shell Bash (Bourne-Again Shell) con ancora più caratteristiche della shell Bourne originale.

Linguaggio di programmazione Bash

Quando si lavora con un sistema Unix-like come Linux, Bash ha solitamente due significati:

  • Bash è un interprete di linea di comando o in altre parole una shell Unix. Significa che ogni volta che si apre un terminale, ci si trova di fronte a una shell Unix che è il più delle volte una shell Bash.

Quando si digitano i comandi direttamente nel terminale, i comandi vengono interpretati dalla shell, eseguiti utilizzando le chiamate di sistema e i valori di ritorno vengono restituiti all’utente finale.

Se non siete sicuri dell’interprete corrente che state usando, la variabile d’ambiente SHELL indica quale shell state usando attualmente.

$ printenv SHELL

Come potete vedere, in questo caso, stiamo usando correttamente l’interprete di comandi Bash per lavorare.

È importante notare che anche se termini come “Bash scripting” e “Shell scripting” sono usati in modo intercambiabile, potrebbero non descrivere effettivamente la stessa cosa a seconda della vostra distribuzione.

Alcune distribuzioni recenti (come Debian 10) hanno collegamenti simbolici dalla shell Bourne originale (chiamata sh) alle loro implementazioni di shell (in questo caso Dash o Debian Almquist shell)

  • Bash descrive anche un linguaggio a riga di comando e viene anche chiamato linguaggio Bash. Bash espone un insieme di operatori e operandi che possono essere utilizzati per avere alcune caratteristiche di base come il piping o l’esecuzione di più comandi contemporaneamente.

Quando si eseguono alcuni piping di base, si è abituati a lavorare con il simbolo “|”. Questo simbolo fa parte del linguaggio a riga di comando Bash.

La stessa logica vale per il simbolo “&&” che esegue il secondo comando se, e solo se, il primo comando è riuscito.

$ command1 && command2

Creare ed eseguire script Bash

Ora che hai qualche nozione sulla shell Bash e sul linguaggio a riga di comando Bash, iniziamo a creare ed eseguire semplici script Bash.

Per creare il tuo primo script Bash, crea semplicemente un file chiamato “script.sh”.

Come probabilmente hai già notato, stiamo ancora usando l’estensione “sh” riferendoci alla shell Bourne originale (indicata anche come sh).

$ touch script.sh

Ora creare un file che termina con l’estensione “sh” non è sufficiente perché il tuo script sia considerato uno script Shell.

Puoi effettivamente vedere che il tuo file non è ancora considerato uno script shell eseguendo il comando file.

$ file script.sh

Come puoi vedere qui, il tuo file è solo descritto un semplice file vuoto.

Per far sì che il tuo file sia descritto come un file di script di shell, devi specificare la linea shebang all’inizio del tuo file.

Specificare la shell usando shebang

Se stai usando Linux da un po’ di tempo, è molto probabile che tu abbia già incontrato la linea shebang all’inizio del tuo file.

Shebang, abbreviazione di “Hash + “Bang”, è una riga unica posta all’inizio degli script di shell per specificare quale shell deve essere usata per interpretare questo script.

#!/bin/<shell>

Nel nostro caso, vogliamo lavorare con script Bash. In altre parole, vogliamo che i nostri script siano interpretati da un interprete Bash.

Per determinare il percorso dell’interprete, potete usare il comando “which”.

$ which bash/bin/bash

Ora che sapete il percorso del vostro interprete, modificate il vostro file di script e aggiungete la linea shebang all’inizio del vostro file.

#!/bin/bash

Ora che avete aggiunto questa linea all’inizio del vostro file, rieseguite il comando “file” per vedere la differenza.

Come potete vedere, l’output è leggermente diverso: questa volta, il vostro script è visto come uno “script di shell Bourne-Again” e soprattutto come un eseguibile.

Cosa succederebbe se non specificassi la linea shebang all’inizio dello script.

Quando non si specifica la linea shebang, lo script viene eseguito utilizzando la shell corrente usata per avviare il comando execute.

Ora che sai come creare script Bash, vediamo come puoi eseguirli.

Eseguire gli script Bash

Per eseguire gli script Bash su Linux, hai essenzialmente due opzioni:

  • Specificando l’interprete di shell che vuoi usare e il file dello script;
  • Utilizzando il percorso del file dello script

Specificando l’interprete di shell

Il primo metodo è abbastanza semplice.

Per eseguire il tuo script bash, devi specificare l’interprete che vuoi usare da solo.

$ bash <script>$ /bin/bash <script>

Utilizzando l’esempio che abbiamo usato prima, questo ci darebbe il seguente output.

Come puoi vedere, questo metodo non richiede nemmeno i permessi di esecuzione sul file, devi solo essere in grado di usare l’eseguibile bash.

Come potete vedere, quando sono loggato come un altro utente, senza i permessi di esecuzione, sono ancora in grado di eseguire questo script.

Questa è un’osservazione importante perché potreste voler memorizzare i vostri file di script in directory protette (a cui solo voi potete accedere) per evitare che altri utenti eseguano i vostri file.

Specificare il percorso dello script

L’altro modo per eseguire gli script bash è quello di specificare il percorso del file.

Per usare questo metodo, il file deve avere i permessi di esecuzione.

Prima, usa il comando “chmod” per impostare i permessi di esecuzione per l’utente corrente.

$ chmod u+x <script>

Come puoi vedere, il colore del file è abbastanza diverso: il tuo terminale attuale evidenzia i file eseguibili usando colori specifici, in questo caso il colore verde.

Ora che il tuo script è eseguibile, puoi eseguirlo specificando il percorso relativo o assoluto dello script.

Utilizzando un file chiamato “script.sh” che si trova nella mia directory di lavoro corrente, lo script può essere eseguito eseguendo

$ ./script.sh

Se ti trovi in un’altra directory, dovrai specificare il percorso assoluto al file dello script.

$ /home/user/script.sh

Come probabilmente hai già capito, questo metodo non è molto conveniente se devi specificare il percorso dello script ogni singola volta.

Per tua fortuna, c’è un modo per eseguire lo script semplicemente digitando il nome del file nella riga di comando.

Aggiungendo lo script a PATH

L’estensione “.sh” non è necessaria perché uno script sia considerato un file script.

Per semplicità, rinomineremo il file esistente “script.sh” in “script”.

Per rinominare i file su Linux, basta usare il comando “mv” e specificare le destinazioni di origine e di destinazione.

$ mv script.sh script

Ora, e se volessi eseguire il tuo script digitando “script”?

Per farlo, devi aggiungere il percorso del tuo script alla tua variabile d’ambiente PATH.

Per stampare il valore corrente della tua variabile d’ambiente PATH, usa “printenv” con l’argomento “PATH”.

$ printenv PATH

Per aggiornare il PATH nel tuo attuale ambiente di lavoro, modifica la variabile d’ambiente PATH usando la seguente sintassi.

$ export PATH="<path_to_script>:$PATH"

Ora, il comando “script” che hai appena definito sarà direttamente disponibile senza specificare alcun percorso: lo puoi lanciare come qualsiasi altro comando.

Nota: se vuoi rendere i tuoi cambiamenti permanenti, segui questi passi per aggiornare correttamente la tua variabile PATH.

Shell built-ins spiegato

Prima di dichiarare qualsiasi variabile nel tuo script di shell, è importante per te conoscere le shell built-ins.

Quando si lavora con la shell Bash, la maggior parte del tempo si eseguono “programmi”.

Esempi di programmi sono “ls”, “fdisk” o “mkdir”. La guida per questi comandi può essere trovata usando il comando “man”, abbreviazione di “manuale”.

Tuttavia, avete mai provato a leggere la documentazione per il comando “source”?

Non sareste in grado di leggere la documentazione usando “man” perché il comando source è una funzione integrata nella shell.

Per leggere la documentazione per le funzioni integrate nella shell, dovete usare il comando “help”.

$ help <command>

L’elenco di shell built-ins è abbastanza esteso, ma ecco uno screenshot di ogni comando built-in di bash che si può trovare sui sistemi Ubuntu.

Usare le variabili di Bash

Ora che conosci i Bash built-ins, è il momento di iniziare a scrivere i tuoi script Bash.

Come promemoria, i comandi digitati nel tuo terminale possono essere usati in uno script Bash nello stesso identico modo.

Per esempio, se vuoi uno script che esegua semplicemente il comando “ls -l”, modifica semplicemente il tuo script, aggiungi la linea shebang e il comando.

#!/bin/bash# This simple script executes the ls commandls -l

Ora, e se volessi avere variabili Bash?

Le variabili Bash sono semplici variabili di programma che possono memorizzare una grande varietà di input diversi.

Per dichiarare una variabile Bash, basta specificare il nome della variabile e il suo valore separati da un segno uguale.

VAR=value

Per poter utilizzare il contenuto della tua variabile Bash nel tuo script, usa “$” e aggiungi il nome della tua variabile.

echo $VAR

Anche se puoi usare questa sintassi per avere il valore della variabile, puoi anche usare la notazione “parentesi”.

Se hai due variabili Bash chiamate VAR1 e VAR2 per esempio, puoi farle stampare entrambe usando la seguente sintassi

echo "${VAR1}${VAR2}"

Esecuzione di comandi all’interno di script

Per eseguire comandi all’interno di script Bash, devi usare la sostituzione di comandi.

La sostituzione dei comandi è una tecnica usata nelle shell Bash per memorizzare il risultato di un comando in una variabile.

Per sostituire un comando in Bash, usa il segno del dollaro e racchiudi il tuo comando tra parentesi.

VAR=$(command)

Per esempio, per ottenere il risultato del numero di file nella tua directory corrente, dovresti scrivere

#!/bin/bashNUMBER=$(ls -l | wc -l)echo "${NUMBER} files in this directory!"

Come puoi vedere, la sostituzione dei comandi è piuttosto utile perché può essere usata per eseguire dinamicamente i comandi in uno script di shell e restituire il valore all’utente.

Parlando della restituzione dei risultati all’utente finale, come gestite gli script non terminati correttamente?

Cosa succede se un comando all’interno dello script non viene eseguito correttamente?

Comprensione degli stati di uscita

Quando stai eseguendo uno script, anche se non stai restituendo un valore, lo script restituisce sempre quello che chiamiamo “stato di uscita”.

Lo stato di uscita nello scripting Bash indica se l’esecuzione dello script è riuscita o meno.

Se il codice di stato è zero, l’esecuzione dello script è riuscita. Tuttavia, se il valore è diverso da zero (diciamo uno, due o più), indica che l’esecuzione dello script non ha avuto successo.

Per dimostrare lo stato di uscita, esegui un qualsiasi comando valido nella tua shell bash.

echo "This is a simple working command"

Ora, usate questo comando per controllare lo stato di uscita dell’ultimo comando eseguito.

echo ${?}

Come potete vedere, l’output di questo comando è “0” o lo stato di uscita dell’ultimo comando che ho eseguito.

Questa sintassi (“${?}”) può essere usata negli script per assicurarsi che i comandi vengano eseguiti correttamente.

Lo stato di uscita può essere usato negli script per uscire dallo script con un codice di stato specifico.

Per esempio, se volete uscire dallo script con un errore, potete usare il seguente comando nel vostro script.

exit 1

Similmente, potete usare il codice di uscita “zero” per specificare che lo script è stato eseguito con successo.

exit 0

Per verificare se il codice di stato era corretto, avrete bisogno di istruzioni condizionali di base come l’istruzione IF.

Manipolare le condizioni in Bash

A volte, eseguire script bash non significa solo avere più comandi uno accanto all’altro: volete avere azioni condizionali.

In alcuni casi, potrebbe essere comodo avere una condizione che controlla se l’utente corrente è l’utente root (o solo un utente specifico sul tuo sistema).

Un modo semplice per avere condizioni in Bash è usare l’istruzione if.

“If” è incorporato nella shell, di conseguenza, il manuale è disponibile tramite il comando “help”

$ help if

La pagina di aiuto descrive la sintassi del comando if usando i punti e virgola, ma noi useremo questa sintassi (che è equivalente)

if ]then <commands>else <command>fi

Caso pratico : controllare se l’utente è root

Per mostrare a cosa può servire l’istruzione if, scriveremo un semplice script per controllare se un utente è l’utente root o no.

Come promemoria, l’utente root ha sempre l’UID impostato a zero su qualsiasi sistema Unix.

Conoscendo questa informazione, controlleremo se l’UID è impostato a zero, se questo è il caso, eseguiremo il resto dello script, altrimenti usciremo dallo script.

Come spiegato in altri tutorial (sull’amministrazione degli utenti), è possibile ottenere l’ID utente corrente utilizzando il comando “id”.

$ id -u1000

Useremo questo comando per controllare se l’utente che esegue lo script è root o no.

Crea un nuovo script e aggiungi la linea shebang ad esso.

#!/bin/bash

Direttamente sotto, aggiungi il comando “id” e memorizza il risultato in una variabile chiamata “USERID” usando la sostituzione del comando.

USERID=$(id -u)

Ora che “USERID” contiene l’ID utente corrente, usate un’istruzione IF per controllare se l’ID utente è zero o no.

Se questo è il caso, scrivete un semplice messaggio informativo, altrimenti uscite dallo script con un exit status di 1.

if ]then echo "This is root"else exit 1fi

Ora se si esegue lo script come utente corrente, lo script uscirà semplicemente con uno stato di uscita di uno.

Ora, prova ad eseguire lo script come utente root (con il comando sudo)

Come puoi vedere, il tuo messaggio informativo è stato visualizzato e lo script è uscito con un codice di errore zero.

Conclusione

In questo tutorial, hai imparato il linguaggio di programmazione Bash e come può essere usato per creare script Bash sul tuo sistema.

Hai anche imparato gli stati di uscita e le dichiarazioni condizionali che sono fondamentali per avere una logica personalizzata nei tuoi script.

Ora che hai una maggiore conoscenza di Bash, dovresti iniziare a scrivere i tuoi script per le tue esigenze: puoi iniziare con un tutorial su come creare file di backup per esempio.

Se sei interessato all’amministrazione del sistema Linux, abbiamo una sezione completa dedicata ad essa sul sito web, quindi assicurati di controllarla!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.