17 BASH – Caratteri speciali

4 Marzo, 2024 (15:48) | BASH, Linux | By: sargonsei

17 BASH – Caratteri speciali, operatori e 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) Operatori per separare istruzioni. Scrivere 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 funzione analoga a quella dell’operatore [;] (puntoevirgola) e fisicamente riconoscibile per il fatto che lo script prosegue sotto con una ulteriore istruzione.

17.2.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
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.2.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.2.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.2.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.2.5) L’operatore [|] (pipe) fa sì che l’output del comando che precede sia utilizzato come input del comando che segue.

17.2.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.2.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.2.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) Operatori che influiscono sul contenuto delle variabili e sull’impaginazione del testo in uscita.
Appartengono a questa categoria tutti i caratteri che, da soli o opportunamente raggruppati all’interno di una stringa di caratteri, in uscita producono un effetto diverso dal mostrare i singoli caratteri che li compongono.

17.3.1) L’operatore “Virgolette” [“] è un operatore di “Quoting parziale”, vale a dire un operatore che si usa sempre in coppia, prima e dopo una stringa di caratteri che, anche se contiene dei caratteri speciali, detti caratteri speciali verranno trattati come caratteri normali, salvo rare eccezioni. Gli spazi nelle variabili sono una eccezione particolare… si veda l’esempio seguente:

:~> A1="0 1  2   3"; echo $A1; echo "$A1"
0 1 2 3
0 1  2   3
:~>

17.3.2) L’operatore ‘Apostrofo’ [‘] è un operatore di ‘Quoting Totale’, vale a dire un operatore che si usa sempre in coppia, prima e dopo una stringa di caratteri che, anche se contiene dei caratteri speciali, detti caratteri speciali verranno trattati come caratteri normali, unica eccezione l’apostrofo stesso.

17.3.3) L’operatore ‘slash bar’ [\] è un operatore di ‘Quoting singolo’, vale a dire un operatore che, se anteposto ad un carattere, acquisisce funzioni diverse a seconda di quale sia il carattere a cui è anteposto. Se anteposto ad un carattere speciale, lo fa diventare un carattere normale.

17.3.4) Esempi di quoting
echo "Quoting parziale. Il presente # non inizia un commento."
echo 'Quoting totale. Il presente # non inizia un commento.'
echo Quoting singolo. Il presente \# non inizia un commento.
echo Carattere speciale. Il presente # inizia un commento.

17.3.5) L’operatore ‘bar’ [/] è utilizzato nella parte dei comandi che definisce il percorso di un file per separare il nome delle singole cartelle che costituiscono il percorso.

17.3.6) L’operatore ‘punto’ [.] è anteposto alla barra [/] nella parte dei comandi che definisce il percorso di un file, in quanto l’accoppiata di caratteri [./] contraddistingue la cartella in cui si trova lo script ovvero la cartella di lavoro della shell BASH.

17.3.7) L’operatore ‘doppiopunto’ [..] contraddistingue la cartella in cui è contenuta la cartella in cui si trova lo script ovvero la cartella in cui è contenuta la cartella di lavoro della shell BASH.

17.3.8) L’operatore ‘tilde’ [~] è anteposto alla barra [/] nella parte dei comandi che definisce il percorso di un file, in quanto l’accoppiata di caratteri [~/] contraddistingue la cartella in cui si trova la [home] dell’utente.

17.4) Sequenze di escape
Quando il carattere speciale [\] è anteposto ad un carattere comune, può dar luogo ad una “sequenza di escape” per cui la suddetta sequenza di caratteri ha un effetto che non coincide con la rappresentazione grafica della sequenza stessa. Seguono alcuni esempi da usare con echo e sed.

\n
echo -e "significa \n a capo"
significa 
 a capo
\r
echo -e "significa \r invio"
 invioica
\t
echo -e "significa \t tabulazione"
significa 	 tabulazione
\v
echo -e "significa tabulazione \v verticale"
significa tabulazione 
                       verticale
\b
echo -e "significa\b ritorno (backspace)2"
signific ritorno (backspace)2
\a
echo -e "significa \a allerta (segnale acustico o accensione di un led)"
significa  allerta (segnale acustico o accensione di un led)
\0xx
echo -e "trasforma in carattere ASCII il valore ottale \045"
trasforma in carattere ASCII il valore ottale %

17.5) 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