Guida minimalista per elaborare script BASH.

Guida minimalista per elaborare script BASH.
ATTENZIONE!!!
Ciò che segue, è una raccolta di informazioni utili per i miei script, quindi non intende in alcun modo sostituire le guide più dettagliate alle quali mi sono ispirato per redigere questi appunti. Chi necessita di qualcosa di più completo, può trovarlo alle pagina web di seguito linkate:

Comandi BASH da ricordare
http://sargonsei.altervista.org/655-2/

Bash scripting
https://guide.debianizzati.org/index.php/Bash_scripting

Guida avanzata di scripting Bash: Capitolo 3. Caratteri speciali
http://www.pluto.it/files/ildp/guide/abs/special-chars.html

Guida avanzata di scripting Bash: Capitolo 4. Comandi
http://www.pluto.it/files/ildp/guide/abs/part4.html

bc esempi di programmazione (Matematica con BASH)
http://appunti.linux.it/a2/bc_esempi_di_programmazione.htm

The GNU Core Utilities
http://maizure.org/projects/decoded-gnu-coreutils/

001 Script BASH – Cose da sapere prima di cominciare
BASH è un linguaggio per la gestione del PC installata di default su Linux, ed installabile su altri Sistemi Operativi. In pratica, è l’equivalente di ciò che il DOS è per i Sistemi Operativi Windows.
I singoli comandi, possono essere impartiti sia da shell (detto anche terminale, o prompt), sia raccolti in un file di testo eseguibile che verrà attivato dall’utente; in quest’ultimo caso, la scrittura del testo dovrà rispettare regole ben precise; questi appunti sono stati redatti al fine di raccogliere in modo semplice queste regole.
La cartella di lavoro è la cartella all’interno della quale la SHELL è stata aperta. Se non diversamente specificato, i comandi che creano o elaborano files e cartelle li creano/cercano esclusivamente all’interno della cartella di lavoro.

002 Script BASH – Operatori/separatori

2.1) Affinchè uno script BASH sia agevolmente riconoscibile sia dagli utenti, sia dal compilatore BASH, è opportuno che la prima riga contenga l’istruzione
#!/bin/bash Questa è l’unica istruzione che, sebbene inizi con [#] (cancelletto), viene interpretata come un’istruzione, e non come un commento.

2.2) Creare uno script, consiste nello scrivere le singole istruzioni una dopo l’altra separate dall’operatore/separatore che si ritiene più opportuno usare, tenendo conto del risultato che l’operatore/separatore ha sul risultato finale; gli operatori che possono essere scritti fra un comando e l’altro (senza paresi quadre) sono: [;] (puntoevirgola), [&] (and), [&&] (doppio and), [#] (cancelletto), [|] (pipe) e [||] (doppia pipe); di questi, gli operatori possibili a fine riga sono: [;] (puntoevirgola) ed [&] (and). Ogni singola istruzione deve essere separata dalle altre, cosa fattibile sia inserendo un operatore/separatore, sia andando a capo; per questo motivo, alcune guide descrivono l’andare a capo come l’inserimento di un operatore/separatore chiamato [newline] avente la medesima funzione dell’operatore [;] (puntoevirgola) e fisicamente riconoscibile per il fatto che lo script prosegue sotto con una ulteriore istruzione.

2.3.1) L’operatore [;] (puntoevirgola) si usa per separare due istruzioni da eseguire una dopo l’altra a prescindere dall’esito delle stesse; per esempio: per eseguire la riga
mkdir prova; cd provaBASH: crea la cartella “prova” nella cartella di lavoro solo se l’utente può scrivere nella cartella in cui il terminale è aperto e solo se la cartella “prova” non esiste; successivamente, solo se la cartella prova esiste, accede alla cartella prova.
Si noti che il comando scritto dopo il puntoevirgola, sebbene impartito, viene eseguito solo dopo che il comando precedente è terminato ed a prescindere dall’esito del comando stesso, quindi se la cartella di lavoro contiene già una cartella prova, il comando [mkdir prova] non viene eseguito, ma il comando [cd prova] verrà eseguito.
Altro comportamento da notare: nella riga
echo sleep 3; echo "Questo messaggio viene visualizzato dopo 3 secondi" l’operatore [;] farà sì che il comando che SEGUE l’operatore venga eseguito dopo aver terminato il comando che PRECEDE l’operatore; siccome (in questo caso) il comando che PRECEDE l’operatore genera una pausa di 3 secondi, il comando che SEGUE l’operatore viene eseguito dopo 3 secondi.

2.3.2) L’operatore [&] (and) è utile per avviare da terminale due o più applicazioni che devono essere disponibili contemporaneamente, in quanto permette di avviarle in background, quindi l’istruzione successiva verrà eseguita prima che l’istruzione precedente sia terminata; per esempio: la riga
echo sleep 3& echo "Questo messaggio viene visualizzato senza aspettare 3 secondi" l’operatore [&] farà sì che il comando che PRECEDE l’operatore venga eseguito in background, quindi il comando che SEGUE l’operatore viene eseguito senza aspettare che il comando che il comando che precede l’operatore sia terminato.

2.3.3) L’operatore [&&] (doppio and) è utile per impartire due o più istruzioni una dopo l’altra, ma le istruzioni scritte dopo l’operatore [&&] vengono eseguite solo se l’istruzione scritta prima dell’operatore [&&] è stata eseguita correttamente; per esempio: la riga
mkdir prova && cd prova fa sì che BASH crei la cartella prova all’interno dell’attuale cartella di lavoro, e poi, solo se ha eseguito l’istruzione precedente, accede alla cartella prova; se, per un qualsiasi motivo (es. la cartella di lavoro contiene già una cartella che si chiama prova) l’istruzione scritta prima dell’operatore [&&] non viene eseguita, non verrà eseguita nemmeno l’istruzione scritta dopo l’operatore [&&].

2.3.4) L’operatore [#] (cancelletto) segnala a BASH che i comandi sono terminati, e quello che è scritto fra il primo operatore [#] e il termine della riga è un commento da non eseguire. Notare che: dopo l’operatore [#], si potrà scrivere qualsiasi cosa, compresi altri operatori o altri comandi, ma nessun comando verrà eseguito, e l’unico operatore che ha effetto è [newline] (andare a capo).

2.3.5) L’operatore [|] fa sì che l’output del comando che precede sia utilizzato come input del comando che segue.

2.3.6) L’operatore [||] si comporta come l’operatore booleano OR, nel senso che viene eseguito solo se il comando precedente non viene eseguito; per esempio la riga:
mkdir prova || cd prova fa sì che BASH crei la cartella prova all’interno dell’attuale cartella di lavoro, ma vi accede solo nel caso in cui la cartella prova esiste già.

2.3.7) L’operatore [newline] (andare a capo) non è un operatore vero e proprio, semplicemente segnala a BASH che la riga è finita, quindi BASH deve eseguirla e passare all’istruzione riportata nella riga successiva.

2.3.8) In una riga, si possono usare più operatori e/o più volte il medesimo operatore, anche raggruppando le istruzioni fra parentesi tonda o graffa. Se si raggruppano le istruzioni fra parentesi tonde, ogni parentesi aperta deve essere chiusa nella stessa riga, mentre le parenti graffe possono essere chiuse in righe successive, ma solo negli script.

003 Script BASH – Utilizzare le variabili
Le variabili BASH non sono tipizzate, nè all’interno di una shell, nè all’interno di uno script. Come conseguenza di ciò, se non diversamente specificato in ogni singola istruzione, vengono trattate come variabili stringa e, anche se nell’istruzione è specificato che una variabile deve contenere il risultato di un’operazione matematica, essa può contenere solo numeri interi, troncando tutti i decimali. Per specificare che il contenuto numerico di una variabile deve essere trattato come una cifra, occorre far precedere la variabile dal comando let seguito da uno spazio. Seguono alcuni esempi.
A=1239/10; echo $A # Visualizza sullo schermo il valore di $A che, in questo caso, è 1239/10
let A=1239/10; echo $A # Visualizza sullo schermo il valore di $A che, in questo caso, è 123
A=1239/10; B=${A/12/BB}; echo "$A $B" # Visualizza sullo schermo 1239/10 BB39/10
let A=1239/10; B=${A/12/BB}; echo "$A $B" # Visualizza sullo schermo 123 BB3

AA=10 BB=20 CC=30; DD=$AA$BB$CC; echo $DD # Visualizza 102030
AA=10 BB=20 CC=30; let DD=$AA$BB$CC; echo $DD # Visualizza 102030
AA=10 BB=20 CC=30; DD=$AA+$BB+$CC; echo $DD # Visualizza 10+20+30
AA=10 BB=20 CC=30; let DD=$AA+$BB+$CC; echo $DD # Visualizza 60
let AA=3+3; echo $AA # Calcola e visualizza il contenuto della variabile AA, che in questo caso è 6
let AA=3-3; echo $AA # Calcola e visualizza il contenuto della variabile AA, che in questo caso è 0
let AA=3*3; echo $AA # Calcola e visualizza il contenuto della variabile AA, che in questo caso è 9
let AA=3/3; echo $AA # Calcola e visualizza il contenuto della variabile AA, che in questo caso è 1

Una variabile può contenere anche un comando. Per esempio:
AA="cd Home"; echo $AA # Visualizza il testo cd Home
AA="cd Home"; $AA # Esegue il comando cd Home

004 Script BASH – Comandi

La SHELL BASH interpreta la pressione del tasto [Invio] come l’ordine di eseguire il comando digitato prima di premere il tasto [Invio], per poi mostrare nuovamente il prompt disponibile ad accettare nuovi comandi. In uno SCRIPT BASH, la pressione del tasto [Invio] è interpretata come l’inserimento dell’operatore/separatore [newline] (andare a capo), che produce l’effetto di far capire all’interprete BASH che la riga contenente uno o più comandi (eventualmente seguiti da un commento) è terminata, e permettere all’utente di scrivere uno o più ulteriori comandi nella riga sottostante.

I comandi da utilizzare negli script BASH sono i medesimi che si utilizzano da SHELL BASH (detto anche terminale, o prompt) ma, anziché essere impartiti da terminale, sono scritti in un file di testo avente estensione .sh oppure -bash oppure .txt reso eseguibile.

Esistono dei comandi che si utilizzano da SHELL BASH, ma non hanno alcun senso se impartiti da SHELL; primo fra tutti, i comandi per acquisire parametri. Per esempio: nomeVariabile=${1}