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

Variabili built-in

Le variabili built-in su Bash, la principale shell di Linux: dalla gestione dei parametri alle più specifiche variabili di controllo dei processi
Le variabili built-in su Bash, la principale shell di Linux: dalla gestione dei parametri alle più specifiche variabili di controllo dei processi
Link copiato negli appunti

Parametri posizionali

Fino ad ora abbiamo fatto uso estensivo del comando echo, fornendogli ogni volta un diverso argomento, che indica su cosa esso debba operare. E come abbiamo ripetutamente evidenziato, anche gli stessi script Bash sono programmi che possono essere eseguiti; anch'essi perciò possono accettare degli argomenti.

Tali argomenti sono disponibili in un programma come i suoi parametri posizionali, simili alle variabili di cui abbiamo discusso nella sezione precedente, ma identificati da numeri e non da veri e propri nomi. Ad esempio, $1 (o ${1}) espande il primo argomento fornito allo script. Quindi, un semplice script welcome.sh che riceve due argomenti - i nomi di due persone - e stampa un messaggio di saluto sarà così composto:

#!/bin/bash
echo "Benvenuti $1 e $2!"

L'esecuzione dello script risulterà la seguente:

$ ./welcome.sh Pippo Pluto
Benvenuti Pippo e Pluto!

È possibile anche riferirsi a tutti gli argomenti in una volta utilizzando $@, che espande tutti i parametri posizionali rispettandone l'ordine. Quando viene posizionato fra virgolette ("$@") ogni argomento diventa una parola separata; questo può rivelarsi utile in combinazione con il comando built-in shift, che rimuove il primo parametro posizionale, in modo che $2 diventi $1, $3 $2 e così via. Ad esempio, possiamo modificare lo script precedente in questo modo:

#!/bin/bash
echo "Benvenuto $1!"
shift
echo "Benvenuti anche a voi $@!"

Se eseguiamo lo script otterremo:

$ ./welcome.sh Pippo Pluto Topolino
Benvenuto Pippo!
Benvenuti anche a voi Pluto Topolino!

Il numero di parametri posizionali è memorizzato in $#: perciò, se $# vale 3, i parametri posizionali validi saranno $1, $2 e $3. È bene notare che i parametri posizionali successivi al nono ($9) richiedono la notazione estesa per essere espansi, utilizzando le parentesi graffe; per riferirsi al decimo parametro, ad esempio, si dovrà indicare ${10}, dato che $10 verrebbe interpretato come ${1}0. Detto questo, non è comunque una buona idea quella di avere così tanti argomenti con significati specifici, visto che sarà difficile poi per un utente ricordarne il giusto ordine e la funzione di ognuno di essi.

Per concludere, in alcune situazioni potrebbe essere utile accedere al nome dello script in esecuzione (cioè, il nome del file; nel caso precedente, ./welcome.sh): esso si troverà memorizzato in $0.

Altre variabili built-in

Altre due variabili principali che vengono impostate automaticamente dall'ambiente Bash sono $$ e $!. Entrambe rappresentano numeri di processi. Nella variabile $$ viene memorizzato il PID (Process IDentifier) della shell in esecuzione. Questo può essere utile per creare file temporanei, come /tmp/my-script.$$, un'operazione piuttosto comune se più istanze dello script possono essere eseguite allo stesso tempo, ciascuna con i propri file temporanei. La variabile $!, invece, corrisponde al PID dell'ultimo processo eseguito in background. Essa è utile per tener traccia del processo mentre questo continua a svolgere il proprio lavoro.

Un'altra variabile interessante è IFS, ovvero l'Internal Field Separator, che rappresenta il carattere (o i caratteri) che separa i diversi parametri fra di loro. Il valore di default è SPACE TAB NEWLINE, ma se questo viene modificato è facile mantenerne una copia, così come mostrato nello script che segue:

#!/bin/bash
old_IFS="$IFS"
IFS=:
echo "Inserisci tre dati separati da due punti ..."
read x y z
IFS=$old_IFS
echo "x è $x y è $y z è $z"

Il risultato dello script è il seguente:

$ ./ifs.sh
Inserisci tre dati separati da due punti ...
Pippo:Pluto:Topolino
x è Pippo y è Pluto z è Topolino

Quando si manipola la variabile IFS (ma questo vale per qualunque altra variabile non sotto il proprio completo controllo) è importante considerare che questa potrebbe contenere spazi, newline e altri caratteri "incontrollabili". È perciò una buona pratica quella di usare le virgolette nella loro gestione, cioè usare old_IFS="$IFS" invece che old_IFS=$IFS.

Ti consigliamo anche