Si erano fatte le tre di notte e stavo seguendo un video in tedesco, fattomi pervenire per posta da un mio caro amico da Köln. Un corso di bash in tedesco, per intenderci. Tutto bene fino a quando il tale, che tra l'altro con il suo suono gutturale della voce mi ha stimolato i succhi gastrici, si è espresso in questi termini, più o meno:
definiamo un array:
$ valori=(1 2 3 4 5 6 7 8 9)
Ora, secondo lui, cioè il tale di cui sopra, se faccio
$ echo ${valori[*]}
$ echo ${valori[@]}
dovrei ottenere lo stesso risultato. Ed è proprio così. Ottengo tutti i valori dell'array. Ma non è questo il punto. Dai, questa cosa la sapevamo...
Mi sono detto, possibile che questi due caratteri, "@" e "*", non abbiano alcuna differenza in codesto ambito?
In realtà sì, una differenza l'ho scovata, forse. Magari ce ne sono pure altre.
$ for i in "${valori[*]}"; do echo " $i "; done #con i doppi apici
0 1 2 3 4 5 6
$ for i in ${valori[*]}; do echo " $i "; done #Senza doppi apici
0
1
2
3
4
5
6
Mentre nel caso del carattere @,
$ for i in ${valori[@]}; do echo " $i "; done #senza doppi apici
$ for i in "${valori[@]}"; do echo " $i "; done #con i doppi apici
ottengo sempre, come risultato,
0
1
2
3
4
5
6
Sicuramente i miei cari amici Ennio e Juhan ne sapranno di più.
Chi volesse approfondire gli arrays in bash, segnalo l'indice del progetto bash, qui.
Io sono stato vittima della somiglianza tra 0 e @ (nella versione stampata con font diversamente chiaro (e poi non ci vedo bene)). Trovate parecchie tracce su questo nel mio blog, dove devo finire il minicorso sull'argomento --prossimamente.
RispondiEliminaLa differenza, che ho letto da qualche parte che non ricordo, dovrebbe stare nel fatto che "@" elenca i valori dell'array separati da newline. Viceversa "*" elenca il contenuto intero dell'array come un'unica stringa.
RispondiEliminaRacchiudendo la fila di valori tra virgolette di fatto la trasformi in un unico valore da passare a echo.
Peace, Love & Happy Scripting!