Eles não são iguais. $*
é uma única string, enquanto $@
é uma matriz real. Para ver a diferença, execute o seguinte script da seguinte forma:
> ./test.sh one two "three four"
O script:
#!/bin/bash
echo "Using \"\$*\":"
for a in "$*"; do
echo $a;
done
echo -e "\nUsing \$*:"
for a in $*; do
echo $a;
done
echo -e "\nUsing \"\$@\":"
for a in "$@"; do
echo $a;
done
echo -e "\nUsing \$@:"
for a in $@; do
echo $a;
done
Os quatro casos são:
Using "$*":
one two three four
Aqui, os parâmetros são considerados como uma string longa citada . Sem aspas:
Using $*:
one
two
three
four
A string é dividida em palavras pelo loop for
.
Using "$@":
one
two
three four
Isso trata cada elemento de $ @ como uma string entre aspas.
Using $@:
one
two
three
four
Isso trata cada elemento como uma string sem aspas, então o último é novamente dividido pelo que equivale a for three four
.