lunedì 7 luglio 2014

Una cosa sugli arrays [bash]

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.

2 commenti:

  1. 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.

    RispondiElimina
  2. La 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.
    Racchiudendo la fila di valori tra virgolette di fatto la trasformi in un unico valore da passare a echo.
    Peace, Love & Happy Scripting!

    RispondiElimina