Qual è la differenza tra @ e * quando si fa riferimento ai valori dell'array bash?


15

Questa guida di Bash dice:

Se il numero indice è @ o *, viene fatto riferimento a tutti i membri di un array.

Quando faccio questo:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
  echo "example.$i "
done

Dà: example.1 example.2 example.3(risultato desiderato).

Ma quando uso ${LIST[*]}, ottengo example.1 2 3invece.

Perché?

Modifica: quando si utilizza printf, @ e * forniscono effettivamente gli stessi risultati.


Sembra funzionare per me. Ho provato sia @ che * e sembra produrre lo stesso risultato entrambe le volte. Quale shell stai usando? Esegui echo $SHELLe incolla l'output sulla tua domanda.
Ramesh,

Il mio esempio era sbagliato, questo in realtà accade solo con echo, non con printf, ho appena notato.
Arjan,


@goldilocks L'altra domanda riguarda $*e $@. Tuttavia, la risposta sarebbe simile e una domanda potrebbe essere considerata un sottoinsieme dell'altra, sono domande diverse.
Stéphane Chazelas,

Risposte:


17

La differenza è sottile; "$ *" crea un argomento, mentre "$ @" si espanderà in argomenti separati, quindi:

LIST=(1 2 3)
for i in "${LIST[@]}"; do
 echo "example.$i"
done

tratterà l'elenco (stampandolo) come più variabili

ma

LIST=(1 2 3)
for i in "${LIST[*]}"; do
 echo "example.$i"
done

tratterà l'elenco come una variabile.


Sapete dove la differenza tra echoe printfviene? Perché con printfnel ciclo for, il riferimento dell'elenco * viene trattato come più variabili.
Arjan,

Cosa significa che qualcosa deve essere trattato come una o più variabili? Mi chiedo se potresti fornire un esempio pratico per illustrare la differenza.
fraternità
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.