Qual è la differenza tra $ @ e $ * negli script di shell?

Negli script di shell, qual è la differenza tra [email protected] e $* ?

Qual è il modo preferito per ottenere gli argomenti dello script?

Ci sono differenze tra i diversi interpreti di shell su questo?

Da qui :

$ @ si comporta come $ * tranne che quando vengono citati gli argomenti vengono suddivisi correttamente se ci sono spazi in essi.

Prendi questo script per esempio (tratto dalla risposta collegata):

 for var in "[email protected]" do echo "$var" done 

Dà questo:

 $ sh test.sh 1 2 '3 4' 1 2 3 4 

Ora cambia "[email protected]" in $* :

 for var in $* do echo "$var" done 

E ottieni questo:

 $ sh test.sh 1 2 '3 4' 1 2 3 4 

(Risposta trovata utilizzando Google )

Una differenza fondamentale rispetto al mio POV è che “$ @” conserva il numero originale di argomenti. È l’ unica forma che fa. Per questo motivo è molto utile per passare argomenti con lo script.

Ad esempio, se il file my_script contiene:

 #!/bin/bash main() { echo 'MAIN sees ' $# ' args' } main $* main [email protected] main "$*" main "[email protected]" ### end ### 

e lo eseguo in questo modo:

 my_script 'abc' de 

Otterrò questo risultato:

MAIN vede 5 arg

MAIN vede 5 arg

MAIN vede 1 arg

MAIN vede 3 arg

Con $ @ ogni parametro è una stringa quotata. Altrimenti si comporta allo stesso modo.

Vedi: http://tldp.org/LDP/abs/html/internalvariables.html#APPREF