$@ is nearly the same as $*, both meaning "all command line arguments". They are often used to simply pass all arguments to another program (thus forming a wrapper around that other program).
The difference between the two syntaxes shows up when you have an argument with spaces in it (e.g.) and put $@ in double quotes:
wrappedProgram "$@"
# ^^^ this is correct and will hand over all arguments in the way
# we received them, i. e. as several arguments, each of them
# containing all the spaces and other uglinesses they have.
wrappedProgram "$*"
# ^^^ this will hand over exactly one argument, containing all
# original arguments, separated by single spaces.
wrappedProgram $*
# ^^^ this will join all arguments by single spaces as well and
# will then split the string as the shell does on the command
# line, thus it will split an argument containing spaces into
# several arguments.
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
For instance, if you call ./someScript.sh foo bar then $@ will be equal to foo bar.
If you do:
./someScript.sh foo bar
and then inside someScript.sh reference:
umbrella_corp_options "$@"
this will be passed to umbrella_corp_options with each individual parameter enclosed in double quotes, allowing to take parameters with blank space from the caller and pass them on.
Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" .... If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined with the beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word. When there are no positional parameters, "$@" and $@ expand to nothing (i.e., they are removed).
The usage of a pure $@ means in most cases "hurt the programmer as hard as you can", because in most cases it leads to problems with word separation and with spaces and other characters in arguments.
In (guessed) 99% of all cases, it is required to enclose it in ": "$@" is what can be used to reliably iterate over the arguments.
$@
is nearly the same as$*
, both meaning "all command line arguments". They are often used to simply pass all arguments to another program (thus forming a wrapper around that other program).The difference between the two syntaxes shows up when you have an argument with spaces in it (e.g.) and put
$@
in double quotes:Example: Calling
will result in:
$@
is all of the parameters passed to the script.For instance, if you call
./someScript.sh foo bar
then$@
will be equal tofoo bar
.If you do:
and then inside
someScript.sh
reference:this will be passed to
umbrella_corp_options
with each individual parameter enclosed in double quotes, allowing to take parameters with blank space from the caller and pass them on.From the manual:
The usage of a pure
$@
means in most cases "hurt the programmer as hard as you can", because in most cases it leads to problems with word separation and with spaces and other characters in arguments.In (guessed) 99% of all cases, it is required to enclose it in
"
:"$@"
is what can be used to reliably iterate over the arguments.These are the command line arguments where:
$@
= stores all the arguments in a list of string$*
= stores all the arguments as a single string$#
= stores the number of arguments