In brief, $@
expands to the positional arguments passed from the caller to either a function or a script. Its meaning is context-dependent: Inside a function, it expands to the arguments passed to such function. If used in a script (not inside the scope a function), it expands to the arguments passed to such script.
$ cat my-sh
#! /bin/sh
echo "$@"
$ ./my-sh "Hi!"
Hi!
$ put () ( echo "$@" )
$ put "Hi!"
Hi!
Now, another topic that is of paramount importance when understanding how $@
behaves in the shell is word splitting. The shell splits tokens based on the contents of the IFS
variable. Its default value is \t\n
; i.e., whitespace, tab, and newline.
Expanding "$@"
gives you a pristine copy of the arguments passed. However, expanding $@
will not always. More specifically, if the arguments contain characters from IFS
, they will split.
Most of the time what you will want to use is "$@"
, not $@
.