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.
Se vuoi aggiornamenti su OS inserisci la tua email nel box qui sotto: