Bash: Difference between $@ and $*
From FVue
Problem
What's the difference between $@ and $*?
Solution
As a rule of thumb, always use "$@". This preserves whitespace, keeps arguments intact and is normally desired. Example:
$ set -- foo bar # Two arguments `foo' and `bar' $ for i in "$@"; do echo $i; done foo bar $ set -- 'foo bar' # Single argument 'foo bar' $ for i in "$@"; do echo $i; done foo bar
The table below shows all different combinations of the example above. And the result is that "$@" is most intuitive. Also it appears "$@" is the default behaviour of the empty for-loop: for i; do echo $i; done.
| arguments | for i ..; do echo $i; done |
||||
|---|---|---|---|---|---|
in $@ |
in "$@" |
in $* |
in "$*" |
(empty) |
|
# Two arguments `foo' and `bar' |
foo bar |
foo bar |
foo bar |
foo bar | foo bar |
# One argument `foo bar' |
foo bar |
foo bar | foo bar |
foo bar | foo bar |
Table 1: Example output of $@, "$@", $* and "$*" in for-loop. The preferred notation in "$@" preserves whitespace and keeps arguments intact.
Advertisement