Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Utilizzare le variabili

I comandi e la sintassi di base per gestire le variabili su una shell Bash di Linux.
I comandi e la sintassi di base per gestire le variabili su una shell Bash di Linux.
Link copiato negli appunti

Come quasi tutti i linguaggi di programmazione esistenti, anche Bash possiede il concetto di variabili - un nome simbolico per una porzione di memoria alla quale è possibile assegnare valori, leggerne e manipolarne il contenuto.

Lo script che segue utilizza la variabile location per memorizzare il valore world, e stampa il solito messaggio "Hello World".

#!/bin/bash
location=World
echo "Hello ${location}"

La stringa ${location} nella terza riga è stata sostituita da "World" prima dell'effettiva esecuzione del comando; questa operazione è conosciuta come espasione di variable, ed è molto più flessibile di come ci si aspetti. Ad esempio, si può anche memorizzare il nome del comando da eseguire:

cmd_to_run=echo
${cmd_to_run} "Hello World"

In entrambi gli esempi appena mostrati, abbiamo usato la notazione ${nome_variabile} per effettuare l'espansione, benché quella più breve $variable_name (omettendo le parentesi graffe) avrebbe avuto lo stesso effetto. Fatta eccezione per i casi in cui sono necessarie (ad esempio, ${foo}bar non è equivalente a $foobar, poiché quest'ultimo verrebbe interpretato come ${foobar}), nella pratica comune le parentesi graffe vengono solitamente omesse.

Bash - allo stesso modo di Perl o PHP - è un linguaggio a tipizzazione dinamica: non è necessario, infatti, specificare il tipo delle variabili, che possono contenere stringhe, interi, numero reali, eccetera. Qualunque valore viene, di fatto, memorizzato come stringa, ma funzioni che richiedono numeri in input possono comunque trattarle come tali. Se proviamo ad assegnare una stringa ad una variabile, e poi a sommarle 1, otterremo un errore:

x="Hello"
expr $x + 1

Questo avviene poiché il programma esterno expr accetta solamente numeri in ingresso. Ma non c'è alcuna differenza sintattica tra le dichiarazioni di variabili che seguono:

MESSAGGIO="Hello World"
MESSAGGIO_BREVE=hi
NUMERO=1
PIGRECO=3.142
PIGRECOALT="3.142"
MIXED=123abc

È possibile impostare dinamicamente il valore di una variabile utilizzando il comando read; lo script che segue chiede il proprio nome e successivamente saluta l'utente in maniera personalizzata:

echo Come ti chiami?
read NOME
echo "Ciao $NOME - tutto ok?"

Abbiamo usato il comando builtin read che legge una linea dallo standard input, e la memorizza nella variabile fornita come parametro. Si noti come anche utilizzando come input il proprio nome completo senza le virgolette, lo script funziona correttamente; ciò è dovuto dal fatto che il comando read racchiude automaticamente fra virgolette il proprio input, così da riuscire a trattare gli spazi in maniera corretta.

Valori di default

In Bash non è obbligatorio che le variabili vengano dichiarate, a differenza di molti altri linguaggi come C o C++. Ma se si cerca di leggere il contenuto di una variabile non dichiarata, si otterrà una stringa vuota, senza che venga generato alcun warning o errore. Ciò può causare alcuni piccoli problemi: se si esegue LA_MIA_VARIABILE=Hello e poi echo $LA_MIA_VARIBAILE, si ottiene un output vuoto (semplicemente perché VARIABILE non è scritto correttamente nel secondo caso).

A volte, per evitare di incorrere in questo tipo di situazioni, può essere utile una funzione specifica delle variabili di Bash. Usando la notazione estesa per l'operazione di espansione di variabile (mediante le parentesi graffe) e i caratteri ":-", è possibile specificare un valore di default da utilizzare nel caso in cui la variabile non sia stata dichiarata:

echo -en "Come ti chiami? "
read NOME
echo "Il tuo nome è : ${NOME:-Mario Rossi}"

In questo caso, anche se l'utente non specifica nessun valore per la variabile NOME, il messaggio successivo utilizzerà il valore di default "Mario Rossi". Esiste anche un altro operatore, ":=", che imposta il valore della variabile a quello di default se quest'ultima non è definita; ciò significa che ogni successivo accesso alla variabile otterrà sempre un valore: o quello impostato dall'utente o quello di default.

echo -en "Come ti chiami? "
read NOME
echo "Il tuo nome è : ${NOME:=`whoami`}"
echo "Tutto ok $NOME?"

Lo scope delle variabili

Il comando export ha effetto sullo scope delle variabili. Procediamo nello spiegare il suo funzionamento. Creiamo un piccolo script var.sh:

#!/bin/bash
echo "VAR è: $VAR"
VAR="Ciao!"
echo "VAR è: $VAR"

Adesso eseguiamolo, e verifichiamo l'ouput:

$ ./var.sh
VAR è:
VAR è: Ciao!

A VAR non è stato assegnato alcun valore, perciò essa risulta vuota. Dopodiché le viene assegnato un valore, e come risultato otteniamo ciò che ci aspettiamo. Adesso eseguiamo:

$ VAR=Salve
$ ./var.sh
VAR è:
VAR è: Ciao!

All'inizio dello script, VAR è ancora vuota. Perché?

Quando viene richiamato lo script dalla shell, viene generata una nuova shell per la sua esecuzione. Ciò è parzialmente causato dall'istruzione #!/bin/bash di cui abbiamo parlato in precedenza. Se vogliamo che la variabile venga resa accessibile anche da altri script, dobbiamo esportarla. Per farlo, eseguiamo:

$ export VAR
$ ./var.sh
VAR è: Salve
VAR è: Ciao!

Adesso diamo un'occhiata alla terza riga dello script: questa modifica il valore di VAR. Tuttavia il nuovo valore non viene poi passato alla shell dalla quale abbiamo eseguito lo script. Se proviamo a leggere il valore di VAR dopo l'ultima esecuzione, otteniamo infatti:

$ echo $VAR
Salve

Una volta che lo script termina, il suo ambiente di esecuzione viene distrutto. Ma VAR mantiene il proprio valore Salve all'interno della nostra shell interattiva. Per far sì che quest'ultima riceva le modifiche effettuate all'interno dello script, dobbiamo eseguire lo script come sorgente: ciò implica che l'esecuzione dello script avviene nella shell che lo richiama, senza crerne una nuova per la sua esecuzione. Possiamo far ciò mediante il comando .:

$ VAR=Salve
$ echo $VAR
Salve
$ . ./var.sh
VAR è: Salve
VAR è Ciao!
$ echo $VAR
Ciao!

Il nuovo valore di VAR è stato riportato anche nella nostra shell. Questa operazione viene effettuata anche per caricare i valori delle variabili che memorizziamo nei file .profile o .bash_profile quando una nuova istanza di una shell viene creata. Si noti come in questo caso non abbiamo bisogno di esportare VAR.


Ti consigliamo anche