Этот вопрос уже имеет ответ здесь:
Мне что они оба хранилище все параметры командной строки кажется.
Так существует ли различие между двумя?
Разница тонкая; "$*"
создает один аргумент, разделенный переменной $IFS
, в то время как "$@"
будет расширяться на отдельные аргументы. В качестве примера рассмотрим:
for i in "$@"; do echo "@ '$i'"; done
for i in "$*"; do echo "* '$i'"; done
При выполнении с несколькими аргументами:
./testvar foo bar baz 'long arg'
@ 'foo'
@ 'bar'
@ 'baz'
@ 'long arg'
* 'foo bar baz long arg'
Подробнее:
http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters
$*
Расширяется до позиционных параметров, начиная с одного. Если расширение происходит внутри двойных кавычек, оно расширяется до одного слова со значением каждого параметра, разделенного первым символом специальной переменной IFS. То есть, "$*"
эквивалентно "$1c$2c..."
, где c - первый символ значения переменной IFS. Если IFS не задана, параметры разделяются пробелами. Если IFS равна null, параметры объединяются без промежуточных разделителей.
$@
Расширение до позиционных параметров, начиная с единицы. Если расширение происходит внутри двойных кавычек, каждый параметр расширяется до отдельного слова. То есть, "$@"
эквивалентно "$1" "$2" ....
Если расширение в двойных кавычках происходит внутри слова, то расширение первого параметра объединяется с начальной частью исходного слова, а расширение последнего параметра - с последней частью исходного слова. Когда позиционные параметры отсутствуют, "$@"
и $@
расширяются до нуля (т.е. удаляются).