Bash scripting - variabili - stringhe: differenze tra le versioni

uso di shift
(uso di shift)
Riga 149: Riga 149:
; <code>$@</code> : contiene la lista di tutti i parametri passati allo script corrente o a una funzione. Ogni parametro viene opportunamente quotato, se questa variabile è quotata, e questo ne permette l'utilizzo nei '''cicli for''' per processare (ad esempio) una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere preferito rispetto a <code>'''$*'''</code> che ha la stessa funzione ma, se quotata, non quota i vari parametri ma l'intera stringa;
; <code>$@</code> : contiene la lista di tutti i parametri passati allo script corrente o a una funzione. Ogni parametro viene opportunamente quotato, se questa variabile è quotata, e questo ne permette l'utilizzo nei '''cicli for''' per processare (ad esempio) una lista di nomi di file che possono contenere anche spazi. L'uso di questa variabile è quindi in genere preferito rispetto a <code>'''$*'''</code> che ha la stessa funzione ma, se quotata, non quota i vari parametri ma l'intera stringa;


''Esempio:''
Esempio:
<pre>
<pre>
# in "$@" si può anche omettere (lasciando solo: for file) perché implicito
for file in "$@"
for file in "$@"
do
do
     # fare quello che si vuole con "$file"
     # fare quello che si vuole con "$file"
     ...
     ...
done
</pre>
L'istruzione <code>shift</code> può essere usata per rimuovere i parametri più a sinistra (partendo da <code>$1</code>), spostando tutti gli altri (<code>$1</code><-<code>$2</code>, <code>$2</code><-<code>$3</code>, ...), in questo modo si possono accedere come una lista solo i successivi.
Per esempio, codice che crea una lista di file in un percorso scelto:
<pre>
# Sintassi accettata: nomescript destinazione lista_file...
# controllo numero argomenti
if [ $# -lt 2 ]; then
    printf %s\\n "Sono richiesti almeno due argomenti!" >&2
    exit 1
fi
# assegno il primo argomento
destinazine=$1
shift  # ora $* e $@ contengono tutti gli altri parametri ($1<-$2, $2<-$3, ...)
      # ossia la lista di file
# controllo l'esistenza della destinazione
if ! [ -d "$destinazione" ]; then
    printf %s\\n "Directory di destinazione non trovata!" >&2
    exit 2
fi
# eseguo un ciclo su tutti i file della lista
# si ricorda che è implicito: in "$@"
for file
do
    # crea il file
    if ! touch -- "${destinazione}/${file}"; then
        # se fallisce si interrompe e stampa un errore
        printf %s\\n "Impossibile creare il file \"${destinazione}/${file}\"!" >&2
        exit 3
    fi
done
done
</pre>
</pre>
Riga 162: Riga 195:
; <code>$!</code> : PID dell'ultimo job in background.
; <code>$!</code> : PID dell'ultimo job in background.


''Esempio:''
Esempio:
<pre>
<pre>
comando &  # lancio un comando in background
comando &  # lancio un comando in background
3 581

contributi