Em muitas perguntas do SO e tutoriais do bash, vejo que posso acessar os argumentos da linha de comando nos scripts do bash de duas maneiras:
$ ~ >cat testargs.sh
#!/bin/bash
echo "you passed me" $*
echo "you passed me" $@
O que resulta em:
$ ~> bash testargs.sh arg1 arg2
you passed me arg1 arg2
you passed me arg1 arg2
Qual é a diferença entre $*
e $@
?
Quando se deve usar o primeiro e quando se deve usar o último?
bash
command-line-arguments
Oz123
fonte
fonte
echo "something $@"
como um erroRespostas:
A diferença aparece quando os parâmetros especiais são citados. Deixe-me ilustrar as diferenças:
mais um exemplo da importância de citar: observe que existem 2 espaços entre "arg" e o número, mas se eu não citar $ word:
e no bash,
"$@"
é a lista "padrão" para iterar sobre:fonte
$*
ou"$*"
pode ser necessário, e o objetivo não pode ser atendido por$@
ou"$@"
?"$@"
entre aspas.Uma boa tabela de visão geral acessível do Bash Hackers Wiki :
onde
c
na terceira linha está o primeiro caractere$IFS
, o Internal Field Separator, uma variável de shell.Se os argumentos devem ser armazenados em uma variável de script e se espera que os argumentos contenham espaços, recomendo de todo o coração empregar um
"$*"
truque com o separador de campo interno$IFS
definido como tab .fonte
$IFS
significa "Separador de campo interno".$ *
$ @
Fonte: Bash man
fonte
$ @ é igual a $ *, mas cada parâmetro é uma string entre aspas, ou seja, os parâmetros são transmitidos intactos, sem interpretação ou expansão. Isso significa, entre outras coisas, que cada parâmetro na lista de argumentos é visto como uma palavra separada.
Obviamente, "$ @" deve ser citado.
http://tldp.org/LDP/abs/html/internalvariables.html#ARGLIST
fonte
Este exemplo permite destacar as diferenças entre "at" e "asterix" enquanto as usamos. Eu declarei duas matrizes "frutas" e "vegetais"
Veja o seguinte resultado no código acima:
fonte