A diferença vem quando você tem argumentos que você passa na linha de comando com caracteres IFS neles (por exemplo, um argumento com um espaço). Para ver a diferença, veja este script:
#!/bin/bash
echo 'Here is $*'
for x in "$*"; do
echo " !${x}!"
done
echo ""
echo 'And here is $@'
for x in "$@"; do
echo " !${x}!"
done
exit 0
Agora, olhe a diferença quando você passa em um argumento com um espaço.
./testspace01.sh "This is" a test
Here is $*
!This is a test!
And here is $@
!This is!
!a!
!test!
Espero que isso ajude.
ATUALIZAÇÃO Ah, atribuir o que foi passado na linha de comando para uma variável traz suas próprias peculiaridades. :)
Lembre-se de que tudo que foi passado na linha de comando é uma matriz. Portanto, atribuir a matriz a uma string fornece algo diferente do que assinar em uma matriz. E, lidar com a matriz é diferente, dependendo se você estiver usando a estrela ou o asterisco. Aqui está uma versão atualizada do meu script.
#!/bin/bash
s_star="$*"
echo 'Here is s_star'
for x in "${s_star}"; do
echo " !${x}!"
done
a_star=("$*")
echo ""
echo 'Here is a_star'
for x in "${a_star}"; do
echo " !${x}!"
done
s_at="$@"
echo ""
echo 'Here is s_at'
for x in "${s_at}"; do
echo " !${x}!"
done
a_at=("$@")
echo ""
echo 'Here is a_at (using star)'
for x in "${a_at[*]}"; do
echo " !${x}!"
done
echo ""
echo 'Here is a_at (using at)'
for x in "${a_at[@]}"; do
echo " !${x}!"
done
exit 0
Aqui está a saída:
./testspace02.sh "This is" a test
Here is s_star
!This is a test!
Here is a_star
!This is a test!
Here is s_at
!This is a test!
Here is a_at (using star)
!This is a test!
Here is a_at (using at)
!This is!
!a!
!test!
Como você pode ver, há diferentes comportamentos.
Espero que isso ajude a esclarecer as coisas ainda mais para você.