Una guida semplice allo scripting della shell Linux con Bash

Ti sei mai trovato a voler imparare di più sullo scripting della shell di Linux, ma non eri sicuro da dove cominciare? Sei relativamente nuovo nel mondo dei sistemi operativi basati su Unix e vuoi estendere le tue competenze per fare della programmazione di base della shell? Questo tutorial per principianti esaminerà le basi dello scripting della shell di Linux con Bash, compresa la creazione e l’esecuzione di uno script, nonché il lavoro con stringhe e cicli.

Lo scripting della shell è utilizzato per automatizzare compiti amministrativi comuni

Indipendentemente dal sistema operativo, gli script della shell sono utilizzati per automatizzare compiti amministrativi ripetitivi. Ad esempio, in Windows è possibile rinominare file utilizzando Esplora file. Ma se hai bisogno di rinominare molti file, sarebbe un compito che richiederebbe molto tempo utilizzare la shell grafica. PowerShell ti consente di automatizzare il compito e ripeterlo in modo affidabile.

Annuncio

Nei sistemi operativi basati su Linux, Bash e altre shell vengono utilizzate per automatizzare compiti come lavorare con file, modificare la configurazione di sistema e molti altri compiti che altrimenti potrebbero essere eseguiti digitando comandi singoli.

Cosa devi imparare dello scripting della shell Bash

Per scrivere ed eseguire uno script Bash, hai bisogno solo di tre cose:

  • Qualsiasi editor di testo semplice, come Notepad, Text Editor, TextEdit, vi, emacs o Visual Studio Code.
  • terminal emulator, an application that comes preinstalled with most operating systems and is often called Terminal, Console, or Command Prompt.
  • Bash stesso.

Il terminale emulatore è dove digitherai i comandi e li eseguirai premendo Invio o Return. Per quanto riguarda Bash, se lo hai già installato dipenderà dalla tua piattaforma:

  • Su macOS, Bash è preinstallato. Nelle versioni più recenti, la Z shell (zsh) è la shell predefinita, e questo è perfetto. Finché Bash è installato, puoi eseguire script Bash da zsh anche.
  • Linux distribuzioni generalmente hanno Bash installato. (Puoi controllare guardando se il tuo sistema include il file /bin/bash.) Android è un caso particolare che non viene fornito con Bash. Ci sono passaggi per installare Bash su Android, che questo articolo non tratterà.
  • Windows non viene fornito con Bash. PowerShell è la shell della riga di comando predefinita in Windows. Dovrai installare una distribuzione Linux sotto il Sottosistema Windows per Linux (WSL) per eseguire Bash.

Per trovare la versione di Bash, esegui il comando bash –version. Anche le versioni precedenti di Bash ti offrono molta potenza, ma Bash 3 e 4 introducono entrambe delle belle notazioni di comando ridotte per determinati comandi di base. Se un comando richiede una di queste versioni di Bash, verrà menzionato di seguito.

Pubblicità

Cosa è una shell?

Nel mondo informatico, una shell è un programma che funge da interfaccia per il sistema operativo sottostante. Una shell può essere un’interfaccia utente grafica (GUI), come la shell di Windows.

Linguaggi di scripting della shell

Tuttavia, le persone in genere utilizzano il termine per fare riferimento specificatamente a un’interfaccia a riga di comando (CLI) — un’interfaccia composta da righe di testo con cui interagisci utilizzando solo la tastiera. Ecco alcuni esempi di linguaggi di scripting shell per sistemi operativi *nix:

  • la shell Bash (abbreviazione di “Bourne Again Shell”)
  • la shell C
  • la shell Korn

Qui ci concentreremo sulla shell Bash. È una popolare shell Unix gratuita preinstallata sulla maggior parte delle distribuzioni Linux e su macOS.

Cosa è uno script shell?

Le shell hanno il proprio linguaggio di programmazione. Utilizzi questo linguaggio per inviare comandi alla shell, che poi esegue. Puoi digitare direttamente questi comandi nella shell, oppure puoi salvarli in un file — uno script — e poi eseguire tale file dalla shell. La sintassi per scrivere comandi è la stessa in entrambi i casi.

Pubblicità

Questo articolo tratterà i concetti di base dello scripting shell per creare questo file.

Basics dello scripting shell

Iniziamo con alcuni concetti basilari dello scripting shell. Per scrivere uno script semplice, impareremo alcuni comandi di base dello scripting shell in Linux:

  1. Creare un nuovo file di testo vuoto in un editor di testo.
  2. Scrivere #!/bin/bash come prima riga.
  3. Inserire i comandi sotto questa riga.
  4. Salvare il file, preferibilmente con estensione “.sh” o senza estensione affatto.

La riga #!/bin/bash è chiamata “shebang”. Indica al tuo shell che questo script deve essere eseguito in Bash e dovrebbe essere la prima riga nello script. Se passi a un shell diverso, lo script verrà comunque eseguito in Bash.

Per provare questo processo da soli, creare un file chiamato ‘hello_world’ nella tua directory home:

#!/bin/bash
echo "hello world"

È tutto qui – hai creato uno script Bash!

Our “hello world” script is just a simple text file

Prima di poterlo eseguire, probabilmente dovrai modificare i permessi del file.

Impostare i permessi per eseguire uno script shell usando chmod

Per modificare i permessi sul nostro file ‘hello_world’, esegui questo comando specifico nel tuo emulatore di terminale. Questo conferisce all’utente che possiede il file il permesso di eseguire il file.:

chmod u+x 'hello_world'
Running our script without vs. with the “execute” permission

Se vuoi solo eseguire il tuo script shell, puoi saltare alla sezione successiva. Per chi è curioso riguardo il comando chmod, chmod sta per “cambiare il modo”, e serve a cambiare i “modi” (o permessi) dei file in Unix. In sistemi operativi Unix-like, puoi impostare i permessi dei file per 3 classi di utenti:

  • L’utente che possiede il file (rappresentato da u in chmod).
  • Il gruppo che possiede il file (g).
  • Gli altri (o).

Con il comando chmod, puoi anche usare a per fare riferimento a tutti questi.

Ogni file ha 3 tipi di permessi (o “modi”):

  • Lettura (r)
  • Scrittura (w)
  • Esecuzione (x)

E puoi anche aggiungere (+) o rimuovere (-) permessi.

Il primo parametro in chmod è una combinazione di questi tre – utente per primo, azione per secondo e modo per terzo. Ecco alcuni esempi di comandi:

  • chmod gu+rw 'hello_world' aggiungerebbe i permessi di lettura e scrittura per il proprietario e il gruppo proprietario.
  • chmod a-x 'hello_world' rimuoverebbe i permessi eseguibili per tutti.
  • chmod u+rwx 'hello_world' 'hello_world_2' darebbe al proprietario il permesso di leggere, scrivere ed eseguire i file “hello_world” e “hello_world_2”.

Abbiamo coperto solo i concetti di base del comando chmod qui. Esiste anche un modo più complicato, ma meno verboso, per definire queste modalità (la “notazione numerica”), così come un comando diverso che puoi usare per vedere quali autorizzazioni hanno i tuoi file (ls -l). Non approfondiremo questi argomenti qui.

Eseguire uno script shell

È ora di eseguire il nostro primo script. In generale, per eseguire uno script, basta digitare il percorso nel terminale e premere Invio.

./hello_world

Puoi utilizzare il percorso relativo o assoluto. Quando si utilizza il percorso relativo, usa sempre ./ all’inizio del comando: Questo indica al terminale di cercare nella cartella corrente (rappresentata da '.'), piuttosto che nelle directory definite nella variabile di ambiente PATH.

Just typing the script name doesn’t work, but running its relative or absolute paths does

Usare commenti per annotare lo script

Tutto ciò che segue un # su una singola riga in uno script Bash è considerato un commento. Questi possono essere utili per comunicare cosa fa una riga complessa o per dare una panoramica di cosa fanno parti più grandi del tuo script.

Per esempio:

#!/bin/bash

#
# This shell script prints "hello world".
#

echo "hello world" # This line prints "hello world".

Un’introduzione alle variabili

Quando si scrivono script, può essere utile definire variabili. In Bash, si fa ciò digitando il nome della variabile e il valore, separati da un segno di uguale: VARIABLENAME='VALORE'.

Non bisogna mettere spazi accanto al segno di uguale, altrimenti Bash penserà che si voglia eseguire un processo invece.

Usa gli apici singoli per racchiudere il valore e evitare che Bash lo interpreti come qualcos’altro. In Bash, le variabili non hanno tipi — sono fondamentalmente dei stringhe. Spetta ai programmi Bash analizzare la stringa come un tipo diverso, ad esempio un numero.

Per fare riferimento al valore di una variabile, usa il nome della variabile preceduto dal segno di dollaro: $VARIABLENAME.

Per provare questo nella pratica, puoi modificare lo script in questo modo:

#!/bin/bash
HELLO="hello variable world"
echo $HELLO # should print "hello variable world"

Ricezione di argomenti

Le singole parole che si scrivono quando si digita un comando sono chiamate argomenti. Nel nostro esempio chmod u+x 'hello_world', chmod, u+x e 'hello_world' sono tre argomenti differenti. chmod è il nome del comando mentre u+x e hello_world sono chiamati parametri — argomenti che forniscono informazioni aggiuntive al comando.

Nel tuo script, puoi accedere a questi argomenti attraverso variabili. Per evitare conflitti con le variabili locali, queste variabili sono nominate utilizzando numeri — $0 si riferisce al nome del comando, $1 è l’argomento successivo, $2 quello dopo, e così via.

Proviamo così:

#!/bin/bash
HELLO="hello $1 world"
echo $HELLO

Ora, esegui questo script con questi parametri:

./hello_world bash script

L’output dovrebbe essere hello bash world, con il primo parametro utilizzato e il secondo ignorato.

Se volessi che bash script fossero considerati come un unico parametro, dovresti metterli tra virgolette:

./hello_world 'bash script'
Words separated by a space are considered as several arguments, except when in quotes

Utilizzo dell’istruzione if per eseguire codice condizionalmente

Una delle cose fondamentali che i programmatori vogliono fare all’interno di uno script è eseguire un pezzo di codice solo se viene soddisfatta una determinata condizione. Bash ha l’istruzione if per questo:

NUM=$RANDOM
if (( $NUM % 2 )) # if CONDITION
then
    echo "$NUM is odd"
fi # this is how you end an if statement

Suggerimento: Da questo punto in poi, si assume che questi esempi facciano parte di uno script più ampio e omettono il #!/bin/bash all’inizio. Non dimenticarlo come prima riga del tuo script, però!

Puoi anche utilizzare else all’interno di un’istruzione if per specificare cosa fare se una condizione non viene soddisfatta, o un’istruzione elif (abbreviazione di “altrimenti se”) per specificare un’altra condizione se la prima condizione non è stata soddisfatta:

NUM=$RANDOM
if [ $NUM -eq 12 ]
then
    echo "$NUM is my favorite number"
elif (( $NUM % 2 ))
then
    echo "$NUM is odd"
else
    echo "$NUM is even"fi

fi‘ è utilizzato per chiudere l’istruzione if.

Suggerimento: Se non sei sicuro di come scrivere la condizione stessa, guarda la prova, le parentesi singole ([]), e la notazione delle doppie parentesi ((())).

The output of our script depends on the value of a random variable

Ripetere una serie di comandi utilizzando un ciclo for

Ora che abbiamo visto come eseguire il codice condizionalmente, vediamo come eseguire il codice un certo numero di volte finché una condizione è soddisfatta.

Il for loop è perfetto per questo compito — in particolare la sua sintassi “a tre espressioni”. L’idea alla base è assegnare una variabile specifica del ciclo e cambiarla gradualmente finché una certa condizione è soddisfatta. Ecco come è strutturato:

for (( ASSIGNMENT_EXPRESSION ; CONDITION_EXPRESSION ; UPDATE_EXPRESSION ))
do
    COMMANDS
done

Ad esempio, se vuoi che un ciclo venga eseguito 10 volte con valori per i che vanno da 0 a 9, il tuo for loop potrebbe apparire così:

for (( i=0; i<10; i++ ))
do
    echo $i
done

Analizziamolo:

  • i=0 is the assignment expression here. It’s run only once before the loop is executed, which is why it’s useful for initializing a variable.
  • i<10 is our condition expression. This expression is evaluated before each iteration of a loop. If it is equal to zero (which means the same as “true” in Bash), the next iteration is not run.
  • i++ is our update expression. It’s run after each iteration of a loop.
The structure of our for loop

Scorrere gli elementi in una lista

Oltre alla sintassi a tre espressioni, puoi anche utilizzare la in parola chiave per definire un for loop. Questa sintassi alternativa è utilizzata per iterare attraverso una serie di elementi.

L’esempio più basilare è semplicemente elencare il set di elementi attraverso i quali vuoi iterare dopo la parola chiave in, separati da spazi. Per esempio:

for i in 0 1 2 3 4 5 6 7 8 9 # space-separated list items
do
    echo $i
done

Puoi anche iterare attraverso gli elementi prodotti da un comando:

for i in $(seq 0 1 9)

La notazione $() è utilizzata per la sostituzione di comandi in generale — esegue un comando e il suo output viene utilizzato come input per il comando principale che lo circonda.

Se stai iterando attraverso numeri interi, è meglio utilizzare la sintassi di intervallo integrata di Bash, che è più efficiente del comando seq. Tuttavia, questa sintassi è disponibile solo nelle versioni più recenti di Bash:

  • for i in {0..9}, disponibile in Bash 3.
  • for i in {0..9..1}, disponibile in Bash 4, dove l’ultimo numero rappresenta l’incremento.

Allo stesso modo, puoi iterare anche attraverso le stringhe: 

for s in 'item1' 'item2' 'item3'

Utilizzando il globbing per ottenere file corrispondenti a un motivo

Uno dei casi d’uso più comuni per i cicli for discussi nella sezione precedente è iterare attraverso file individuali.

Per affrontare questo, dobbiamo prima parlare delle cosiddette “espansioni glob”. Questa è una funzionalità di Bash che ti consente di specificare i nomi dei file utilizzando il pattern matching. Ci sono caratteri speciali chiamati caratteri jolly che puoi usare per definire quei pattern.

Prima di approfondire questo argomento, diamo un’occhiata a qualche esempio specifico:

  • echo *: Un comando che restituisce i nomi di tutti i file nella tua directory corrente, escludendo quelli nascosti
  • echo *.txt: Un comando che restituisce i nomi di tutti i file non nascosti con estensione txt nella tua directory corrente
  • echo ????: Un comando che restituisce tutti i nomi di file di quattro caratteri nella tua directory corrente

 che abbiamo usato sono * e ? qui. C’è anche un altro wildcard che non abbiamo usato. Ecco una panoramica

  • L’asterisco (*) rappresenta un qualsiasi numero di caratteri (anche 0) in un nome di file o directory
  • Il punto interrogativo (?) rappresenta un singolo carattere in un nome di file o directory
  • Il doppio asterisco (**) rappresenta un qualsiasi numero di caratteri in un percorso completo di file. È una funzionalità in Bash 4 e versioni successive e deve essere abilitata eseguendo shopt -s globstar
  • Le parentesi quadre ([]) sono utilizzate per rappresentare un carattere all’interno di un insieme di simboli in un nome di file o directory. Ad esempio [st]ake troverebbe i file chiamati sake o take, ma non stake

Si noti che tutti i file nascosti (ovvero i file con nomi che iniziano con un punto .) vengono ignorati quando si utilizza l’espansione delle glob

La notazione delle parentesi quadre consente una maggiore complessità, inclusa:

  • Intervalli definiti dal primo e dall’ultimo valore – ad es. [1-8]
  • Eliminazione di determinati caratteri utilizzando ! come primo carattere all’interno delle parentesi quadre – ad es. [!3]

Per trattare uno di questi caratteri speciali come un normale carattere senza alcun significato, basta mettere una barra rovesciata prima di esso – ad es. \?.

A few examples of globbing

Iterazione dei file utilizzando un ciclo for

Ora che abbiamo coperto le basi dell’espansione glob, vediamo come usarla per iterare tra i file.

Possiamo semplicemente utilizzare gli operatori glob nel ciclo for stesso. Ecco un semplice esempio di un ciclo che stampa il nome di ogni file nella directory corrente:

for f in *
do
    echo $f
done

Per stampare i nomi di ogni file nella directory corrente e nelle relative sottodirectory, controlla di essere in esecuzione Bash 4.0 o superiore eseguendo bash --version, e poi puoi eseguire il seguente comando:

shopt -s globstar # enables using **
for f in **
do
    echo $f
done

Suggerimento: Se stai utilizzando una versione più vecchia di Bash, non potrai utilizzare la globbing con un ciclo for per questo. La tua migliore azione sarebbe il comando find, ma non ne parleremo in questo articolo.

Questi sono, naturalmente, solo alcuni dei cicli più semplici che puoi eseguire, ma c’è molto di più che puoi fare. Ad esempio, per rinominare tutti i file JPG in una cartella per dare loro un nome di file sequenziale coerente, potresti eseguire:

i=1
for f in *.jpg
do
    mv -i -- "$f" "image_$i.jpg"
    let i=i+1
done
Checking the Bash version, then running our script

Eseguire il codice mentre una condizione è vera

Il ciclo for non è l’unico tipo di ciclo che possiamo usare in Bash — abbiamo anche il tipo while: Questo tipo di ciclo viene eseguito finché una specifica condizione è vera.

La sintassi è simile alla sintassi del ciclo for:

while CONDITION
do
    COMMANDS
done

Per un esempio pratico, ecco come potresti leggere un file riga per riga (senza spazi vuoti iniziali o finali) fino a quando raggiungi la fine del file:

while read -r line
do
    echo "$line"
done < FILENAME # Replace FILENAME with the path to a text file you'd like to read
Using a while loop inside our script to have it print itself

Puoi anche sostituire un ciclo for con un ciclo while, ad esempio per iterare da 0 a 9:

i=0
while [ $i -lt 10 ]
do
    echo $i
    let i=i+1
done

E potresti anche teoricamente eseguire un ciclo all’infinito. Ecco un esempio di comando:

while true
do
    echo "running forever"
done

Suggerimento: Per interrompere lo script, premi semplicemente Ctrl+C.

Sebbene questo ciclo infinito possa sembrare inutile a prima vista, in realtà può essere piuttosto utile, specialmente se combinato con l’istruzione break.

Uscire da un ciclo

L’istruzione break viene utilizzata per uscire da un ciclo.

Questo ti consente di eseguire un ciclo infinito e uscirne quando si verificano eventuali condizioni di uscita.

Per vedere un esempio semplice, possiamo replicare il nostro ciclo che va da 0 a 9 con un ciclo infinito come questo:

i=0while true
do
    if [ $i -eq 10 ]
    then
        break
    fi
    echo $i
    let i=i+1
done

Se hai diversi cicli while annidati, puoi aggiungere un numero dopo l’istruzione break per specificare da quale livello di ciclo uscire: break 1 è lo stesso di break e uscirà dal ciclo più vicino, break 2 uscirà dal ciclo un livello sopra, ecc.

Diamo un’occhiata a un esempio rapido, questa volta con cicli for, iterando attraverso ogni combinazione di parole di quattro lettere fino a quando non si raggiunge la parola “bash”:

for l4 in {a..z}
do
    for l3 in {a..z}
    do
        for l2 in {a..z}
        do
            for l1 in {a..z}
            do
                echo "$l4$l3$l2$l1"
                if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ]
                then
                    break 4
                fi
            done
        done
    done
done

A related keyword that’s also worth a mention is continue, which skips to the next iteration of the loop. Just like break, it also takes an optional numeric argument that corresponds to the loop level.

Ecco un esempio sciocco in cui saltiamo tutte le parole con la lettera E nella nostra lista di parole di quattro lettere abbreviate:

for l4 in {a..z}
do
    if [ $l4 = "e" ]
    then
        continue
    fi
    for l3 in {a..z}
    do
        if [ $l3 = "e" ]
        then
            continue
        fi
        for l2 in {a..z}
        do
            if [ $l2 = "e" ]
            then
                continue
            fi
            for l1 in {a..z}
            do
                if [ $l1 = "e" ]
                then
                    continue
                fi
                echo "$l4$l3$l2$l1"
                if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ]
                then
                    break 4
                fi
            done
        done
    done
done

Potremmo anche eseguire tutte queste istruzioni continue al livello più profondo del ciclo:

for l4 in {a..z}
do
    for l3 in {a..z}
    do
        for l2 in {a..z}
        do
            for l1 in {a..z}
            do
                if [ $l4 = "e" ]
                then
                    continue 4
                fi
                if [ $l3 = "e" ]
                then
                    continue 3
                fi
                if [ $l2 = "e" ]
                then
                    continue 2
                fi
                if [ $l1 = "e" ]
                then
                    continue
                fi
                echo "$l4$l3$l2$l1"
                if [ $l4 = "b" -a $l3 = "a" -a $l2 = "s" -a $l1 = "h" ]
                then
                    break 4
                fi
            done
        done
    done
done
Our script stops once it generates the word “bash”

Come ottenere l’input dell’utente in uno script shell

A volte, vuoi che l’utente interagisca direttamente con il tuo script anziché utilizzare solo gli argomenti iniziali dello script. Ecco dove entra in gioco il comando read.

Per ottenere l’input dell’utente e salvarlo in una variabile chiamata NAME, useresti questo comando:

read NAME 

Questa è la forma più semplice del comando, composta solo dal nome del comando e dalla variabile in cui desideri salvare l’input.

Più frequentemente, però, vorrai chiedere all’utente in modo che sappia cosa scrivere. Puoi farlo con l’argomento -p, dopo il quale scrivi il prompt preferito.

Ecco come potresti chiedere un nome, assegnandolo a una variabile chiamata NOME:

read -p "Your name: " NAME
echo "Your name is $NAME." # this line is here just to show that the name has been saved to the NAME variable
The script saves our input to a variable and then prints it

Stampa dei caratteri speciali in una stringa

Ci sono diversi caratteri in Bash di cui devi prestare attenzione nell’uso. Ad esempio, spazi all’interno dei nomi dei file, virgolette all’interno delle stringhe, o backslash praticamente ovunque.

Per dire a Bash di ignorare il loro significato speciale in certi contesti, puoi o “escapare” i caratteri o racchiuderli in virgolette letterali.

“Escapare” un carattere speciale significa dire a Bash di trattarlo come un semplice carattere senza alcun significato speciale. Per farlo, scrivi un backslash prima di quel carattere.

Immaginiamo di avere un file chiamato img \ 01 *DRAFT*, ad esempio. In Bash, potremmo far riferimento ad esso in questo modo:

img\ \\\ 01\ \*DRAFT\*

Ecco un elenco non esaustivo dei caratteri speciali in Bash:

  • Spazi bianchi: spazio, tabulazione, riga vuota
  • Virgolette: ”, “”
  • Parentesi, graffe e parentesi quadre: ( ), { }, [ ]
  • Tubature e reindirizzamenti: |, <, >
  • Caratteri jolly: *, ?
  • Diversi: !, #, ;, =, &, ~, `
  • Il carattere di escape stesso: \

Se sei nuovo in Bash, potrebbe essere complicato ricordare quali caratteri abbiano un significato speciale. Perciò, in molte situazioni, potrebbe essere più semplice utilizzare una virgoletta letterale: Semplicemente racchiudi il testo contenente eventuali caratteri speciali tra virgolette singole, e tutti i caratteri speciali all’interno di esse verranno ignorati.

Ecco come apparirebbe per il nostro esempio:

'img \ 01 *DRAFT*'

E se vuoi utilizzare un carattere speciale, ma fare l’escape degli altri? Potresti fare l’escape di ogni altro carattere usando un backslash, ma puoi anche risparmiarti il problema e circondare tutto tranne quel carattere speciale con virgolette letterali.

Ad esempio, diciamo che hai diversi file chiamati img \ 01 *v1 DRAFT*, img \ 01 *v2 DRAFT*, img \ 01 *ROUGH DRAFT*, ecc., e vuoi utilizzare una glob expansion per corrispondere a tutti quei nomi file. Ecco cosa potresti scrivere:

'img \ 01 *'*' DRAFT*'
This glob expansion finds all of our 3 oddly-named files

Se ciò che devi scrivere contiene un singolo apostrofo – ad es. img \ 01 *’FINAL’* – puoi usare una strategia simile, combinando stringhe letterali e escape:

'img \ 01 '\''FINAL'\'

Come concatenare stringhe in Bash

Diciamo che hai due o più variabili stringa – ad esempio un nome e un cognome:

FIRST_NAME="Johnny"LAST_NAME="Appleseed"

Per combinare queste variabili in una stringa, forse con un delimitatore personalizzato, crea semplicemente una nuova stringa composta da queste due variabili:

NAME="$LAST_NAME"', '"$FIRST_NAME"

Puoi anche utilizzare virgolette doppie con variabili inline per questo, utilizzando parentesi graffe per separare i nomi delle variabili dal testo circostante:

NAME="${LAST_NAME}, ${FIRST_NAME}"

Bash consente anche l’uso dell’operatore += per aggiungere testo a una stringa, così:

NAME='Appleseed'NAME+=', 'NAME+='Johnny'
Examples of different ways of stringing together text

Eseguire comandi all’interno di una stringa

Bash ti permette anche di utilizzare l’output di un comando all’interno di una stringa, noto anche come sostituzione di comando. Basta circondare il tuo comando con $(). Ad esempio, per stampare un timestamp corrente, puoi eseguire:

echo "Current timestamp: $(date)"
Using command substitution to print the current timestamp

Potresti anche ricordare questa sintassi da un esempio precedente di ciclo for, quando abbiamo iterato attraverso una sequenza di interi da 0 a 9:

for i in $(seq 0 1 9)
do
    echo $i
done

Il comando sostituito viene eseguito in una subshell. Ciò significa che, ad esempio, le variabili create durante il comando non influenzeranno l’ambiente in cui stai eseguendo il tuo script.

Impostazione e restituzione dei codici di uscita in uno script shell

Per uno script più complesso, è consuetudine far restituire un codice di uscita – un numero compreso tra 0 e 255 che dice alle persone se lo script è stato eseguito correttamente o ha riscontrato un errore.

Per quanto riguarda quali numeri utilizzare, il manuale ufficiale di Bash specifica i seguenti:

  • 0: Programma eseguito correttamente.
  • 2: Programma usato in modo errato (ad esempio a causa di argomenti non validi o mancanti).
  • 1 e 3-124: Errori definiti dall’utente.
  • 126: Comando non eseguibile.
  • 127: Comando non trovato.
  • 125 e 128-255: Stati di errore utilizzati dallo shell. Se un processo viene interrotto da un segnale N, lo stato di uscita è 128 + N.

Come puoi vedere, tutti i numeri diversi da 0 indicano un tipo di errore. Il codice di uscita 1 è comunemente usato per errori generali. Nella maggior parte dei casi, non avrai bisogno di utilizzare alcun codice di uscita superiore a 2.

Per restituire un codice di uscita dal tuo script, basta usare il comando exit. Ad esempio, per uscire con un codice 2, scriveresti exit 2.

Se non usi il comando exit nel tuo script o usi il comando senza specificare un codice, sarà restituito lo stato di uscita dell’ultimo comando eseguito nel tuo script.

Per ottenere il codice di uscita dell’ultimo comando eseguito nel tuo shell, utilizza la variabile $?: echo $?.

Come chiamare una funzione

Nel caso in cui stai scrivendo uno script più lungo o con porzioni di codice ripetitive, potresti voler separare parte del codice in funzioni. Esistono due formati che puoi usare per definire le funzioni: In entrambi i casi, tutto il codice della funzione è contenuto all’interno delle parentesi graffe e si differenzia solo la dichiarazione della funzione.

Il formato più compatto utilizza parentesi che seguono il nome della funzione per dichiarare una funzione:

function_name () {
    echo "This is where your function code goes"
}

L’altro formato utilizza la parola chiave function davanti a un nome di funzione:

function function_name {
    echo "This is where your function code goes"
}

Le funzioni devono essere dichiarate prima di essere chiamate nello script. Si chiama una funzione esattamente come si esegue un comando regolare, utilizzando il nome della funzione come comando:

function_name

Passaggio di dati a una funzione utilizzando variabili

Nel Bash, le funzioni non possono accettare argomenti. Per inviare informazioni a una funzione, è necessario utilizzare variabili globali nello script.

Per esempio:

is_your_name_defined () {
    if [ -z "$YOUR_NAME" ]
    then
        echo "It doesn't seem like I have your name."
    else
        echo "Is this your name: ${YOUR_NAME}?"
    fi
}
read -p "Your name: " YOUR_NAME

is_your_name_defined

A differenza di quanto potresti essere abituato in altre lingue, le variabili che definisci all’interno della tua funzione sono globali e visibili al codice al di fuori del tuo script. Per definire una variabile con ambito locale solo alla tua funzione (quindi non accessibile a tutto il codice esterno ad essa), utilizza la parola chiave local: ad esempio local i=0.

Se desideri restituire valori da una funzione, è necessario utilizzare anche variabili globali. Nel Bash, le funzioni possono solo restituire codici di uscita, utilizzando la parola chiave return. Vediamo un esempio:

is_your_name_defined () {
    if [ -z "$YOUR_NAME" ]
    then
        MESSAGE="It doesn't seem like I have your name."
    else
        MESSAGE="Is this your name: ${YOUR_NAME}?"
    fi
}
read -p "Your name: " YOUR_NAME

is_your_name_defined

echo $MESSAGE
The output of our script depends on the values entered

Riepilogo

Lo scripting Bash consente di fare molte cose su un sistema operativo basato su UNIX. Questo articolo ha toccato alcuni concetti di base dello scripting Bash, inclusa la creazione e l’esecuzione di script, il lavoro con le stringhe e l’uso dei cicli nel tuo codice. Ci auguriamo che possa essere un buon punto di partenza per il tuo viaggio nello scrivere potenti script Bash che soddisfino le tue esigenze.

C’è molto altro da imparare riguardo al Bash, inclusi alcuni dei comandi più utili, la navigazione nel filesystem e altro ancora. Facci sapere nei commenti quali argomenti dovremmo trattare in seguito.

Articolo correlato:

Source:
https://petri.com/shell-scripting-bash/