17 BASH – Operatori/separatori
17.1) Rendere uno script BASH agevolmente riconoscibile come tale.
Affinché uno script BASH sia agevolmente riconoscibile come tale sia dagli utenti, sia dal compilatore BASH sia dal Sistema operativo, e non venga erroneamente riconosciuto per uno script scritto in un altro linguaggio, è opportuno che la prima riga dello script stesso contenga l’istruzione
#!/bin/bash
Questa è l’unica istruzione che, sebbene inizi con [#] (cancelletto), viene interpretata come un’istruzione, e non come un commento.
17.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.
17.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 prova
BASH: 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
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.
17.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
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.
17.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 [&&].
17.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).
17.3.5) L’operatore [|] (pipe) fa sì che l’output del comando che precede sia utilizzato come input del comando che segue.
17.3.6) L’operatore [||] (doppia pipe) 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à.
17.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.
17.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.
17.3.9) Commenti su varie righe consecutive
Qualora sia necessario commentare più linee, la riga che precede i commenti deve contenere unicamente [: ‘] (senza parentesi quadre) e la riga che segue i commenti deve contenere unicamente [‘] (senza parentesi quadre)
#!/bin/bash
# Per eseguire lo script digitare ./ seguito dal nome dello script, Poi digitare [invio]
echo prima
: 'duepunti + spazio + apice + commento + apice'
echo durante
: '
questo è un
commento
multilinea
'
echo dopo
oppure
#!/bin/bash
echo prima
: "duepunti + spazio + doppioapice + commento + doppioapice"
echo durante
: '
questo è un
commento
multilinea
'
echo dopo
oppure
#!/bin/bash
echo prima
: || {duepunti + spazio + || + spazio + apreGraffa + commento + chiudeGraffa}
echo durante
: || {
questo è un
commento
multilinea
}
echo dopo