$@ is nearly the same as $*, both meaning "all command line arguments".
They are often used to pass all arguments to another program
The difference between the two syntaxes shows up when you have an
argument with spaces in it and put $@ in double quotes:
Example: Calling
wrapper "one two three" four five "six seven"
will result in:
"$@": wrappedProgram "one two three" four five "six seven"
"$*": wrappedProgram "one two three four five six seven"
^^^^ These spaces are part of the first
argument and are not changed.
$*: wrappedProgram one two three four five six seven
$@: wrappedProgram one two three four five six seven