Ответ 1
Разница тонкая; "$*"
создает один аргумент, разделенный переменной $IFS
, а "[email protected]"
будет расширяться на отдельные аргументы. В качестве примера рассмотрим:
for i in "[email protected]"; 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".... Если двойное кавычное разложение происходит внутри слова, разложение первого параметра соединяется с начальной частью исходного слова, а расширение последнего параметра соединяется с последней частью исходного слова. Когда нет позиционных параметров, "$ @" и [email protected]расширяются до нуля (т.е. Удаляются).