Use: "$@"
se você quiser representar os argumentos originais (incluindo nenhum argumento) com precisão.
Existem 5 notações para mencionar:
-
$@
-
$*
-
"$@"
-
"$*"
-
${1+"$@"}
Os dois primeiros são equivalentes; ambos dividem as palavras na lista de argumentos e as transmitem ao comando que está sendo invocado. Eles raramente são a escolha correta.
Os dois segundos são radicalmente diferentes. A notação "$@"
copia efetivamente os argumentos para o shell (ou os argumentos definidos por meio do comando set
) para o comando que está sendo chamado, preservando o número de argumentos, os espaços dentro deles e a divisão entre eles. Se houver zero argumentos, isso não gera nada.
A notação "$*"
cola todos os argumentos em uma única string, colocando um espaço entre os argumentos, mas preservando os espaços dentro dos argumentos. É apropriado para uso em contextos como:
echo "You said, '$*'"
onde a máxima fidelidade à linha de comando original não é crucial.
A notação final, ${1+"$@"}
, é uma ressaca de dias passados que você pode encontrar em scripts de shell antigos. Era uma vez (e há muito tempo - como 30 anos atrás), o shell Bourne tratou "$@"
como um único argumento vazio quando não havia argumentos. Esse não é o comportamento há muito tempo, mas alguns scripts escritos há muito tempo ainda podem se proteger usando essa notação. A notação ${1+X}
significa 'se $1
estiver definido como qualquer coisa, até mesmo uma cadeia vazia, em seguida, forneça o valor X
. Na notação em discussão, o X
é "$@"
, que é uma lista de argumentos quando se sabe que há pelo menos um - e, de outro modo, nenhum argumento. O que significa o mesmo que "$@"
em qualquer shell moderno.