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
.