Dúvida com $* e $@

1. Dúvida com $* e $@

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/10/2005 - 16:02h

Bem, essa é primeira mensagem desse fórum, espero que não seja também a primeira moderada ...

Procurei no pelo google a diferença entre o $* e o $@ (é particularmente complicado fazer uma pergunta usando esses caracteres) e consegui encontrar apenas uma página no Advanced Bash-Scripting Guide onde ele dizia que diferença entre ambos somente existia quando os símbolos estivessem entre "" ou ' ', a explicação foi curta e eu não entedi nada, alguém sabe me dizer a diferença entre o uso de ambos ?

Usei scripts simples tipo
for i in $@; do ; echo $i ; done
mas ainda assim não consegui visualizar as diferenças.


  


2. Olá mitre.

Felipe Prenholato
chronos

(usa Gentoo)

Enviado em 04/10/2005 - 16:26h

Achei algo sobre $@ e $* no manual do bash (man bash).
Como eu não cheguei a ler por completo a parte que fala deles e acho que o texto é razoavelmente grande para colocar aqui eu lhe indico o local onde esta falando sobre os mesmos.

É na seção "Special Parameters", procura por Special Parameters ou $@ que ti já para nele.

Fala sobre os parâmetros * @ # ? - $ ! 0 e -.

Espero ter dado uma luz apesar de não postar a resposta.

thx

chronos


3. Re: Dúvida com $* e $@

Lincoln Lordello
lordello

(usa Ubuntu)

Enviado em 04/10/2005 - 16:58h

A diferença é o seguinte, vamos supor que rodei o "script.sh" com as variáveis "joao" "maria" "joze".

$ ./script.sh joao maria joze

$*: todo o conteúdo é impresso como se fosse uma variável única, apenas com espaços entre as informações. Exemplo:

#!/bin/bash
for x in "$*"; do
echo $x
done

Resultado:
joao maria jose

Aqui você vê todo o conteúdo numa só linha.

$@: cada entrada é separada por uma quebra de linha, dessa forma o bash vai entender que são coisas diferentes. Exemplo:

#!/bin/bash
for x in "$@"; do
echo $x
done

Resultado:
joao
maria
jose

Aqui você vê o conteúdo separado em linhas diferentes, pois são executados separadamente.
Sempre que você fornece informações a um script ele acessa isso com as variáveis $1 $2 $3 ${10}etc.. Um detalhe que a partir da variável 10 é preciso usar chaves.
Exemplo:
$ ./script.sh joao maria joze
#!/bin/bash
echo "O ${3} é filho da ${2} e primo do ${1}."

Resultado:
O joze é filho da maria e primo do joao.
É sempre bom usar aspas duplas e chaves em variáveis, assim você evita que elas se misturem com seu script.


4. Re: Dúvida com $* e $@

Perfil removido
removido

(usa Nenhuma)

Enviado em 04/10/2005 - 18:20h

Eu entendi a explicação teórica, mas não consegui repetir os procedimentos.

Bem, eu executei ..

#!/bin/bash
for x in $*; do
echo $x
done

e

#!/bin/bash
for x in $@; do
echo $x
done

no meu caso o resultado foi exatamente o mesmo para os dois scripts:

./scritp joao maria jose

joao
maria
jose

Aliás eu tinha realizado esse teste antes e continuou do mesmo jeito...

Entretanto.
Entre o post original e sua resposta... eu vi o seguinte

untar(){ for i in "$@"; do tar xvf "$i"; done; }
untar(){ for i in "$*"; do tar xvf "$i"; done; }

Observe as duas funções acima.
as duas estão sendo chamadas em um script, chamaremos de "teste"

Considerando um diretório que tem arquivos com espaço nos nomes eu vi

./teste *.tar ==> funcionar para "$@"
./teste *.tar ==> não funcionar para "$*"

agora olha só minha confusão:

teste arquivo1.tar arquivo2\ teste2.tar

por que afinal quando eu uso "$@" ele sabe que o espaço correto é entre "arquivo1.tar" e arquivo2\ teste2.tar e quando eu uso "$*" este "executa" o espaço entre arquivo2 e teste2.tar como se fossem dois arquivos diferentes, quando eu uso $* ele não deveria ser capaz de entender arquivo2\ teste2.tar como se fosse uma coisa só ? ele não é o ${2} do
script ? Além do que não era para ser exatamente o contrário ?

Apenas para fechar : O fato de eu ter conseguido achar uma aplicação prática não significa que eu tenha realmente entendido o por que dessa aplicação funcionar ... muito menos que eu tenha conseguido achar o ponto chave entre $* e $@, quero dizer, o nosso exemplo acima nao funcionou comigo, seria diferença entre versões ? Só para confirmar estou usando bash 2.05b, qual é o seu ?





5. Falha nossa

Lincoln Lordello
lordello

(usa Ubuntu)

Enviado em 06/10/2005 - 03:23h

Eu esqueci das aspas duplas :-/
O script teste ficaria assim:
#!/bin/bash
for x in "$*"; do
echo $x
done

e

#!/bin/bash
for x in "$@"; do
echo $x
done

Esse script foi apenas como exemplo. Porque o "for" executou as duas coisas iguais? Porque ele recebe listas separadas por espaços, mas imagine que temos nomes com espaços, o resultado seria interessante. Os nomes precisam ficar entre aspas quando digitados como argumento, senão ao invés de termos três nomes, teremos 8 nome separados por espaços, sacou?

./teste.sh "joao das coves" "maria da gloria" "joze antunes"

#!/bin/bash
for x in "$*"; do
echo $x
done

Resultado:
joao das coves maria da gloria joze antunes

#!/bin/bash
for x in "$@"; do
echo $x
done

Resultado:
joao das coves
maria da gloria
joze antunes

#!/bin/bash
for x in $*; do ## AQUI ESTÁ SEM ASPAS DE NOVO ##
echo $x
done

Resultado:
joao
das
coves
maria
da
gloria
joze
antunes

Agora tente carregar o script sem as aspas:
./teste.sh joao das coves maria da gloria joze antunes

#!/bin/bash
for x in "$@"; do
echo $x
done

Resultado:
joao
das
coves
maria
da
gloria
joze
antunes

Espero ter ficado mais claro agora.


6. Re: Dúvida com $* e $@

Perfil removido
removido

(usa Nenhuma)

Enviado em 06/10/2005 - 11:00h

Perfeito,
Valeu!


7. KISS

Leonardo Fedalto
Eagle

(usa Slackware)

Enviado em 15/07/2006 - 02:10h

Olá a todos.
Apesar da discussão já poder ser considerada concluída, vou deixar minha explicação sobre $* e $@ que é bem simples e talvez possa dar a luz a alguém.

Como exemplo os argumentos passados a um certo script são A, B, C e D.
O bash expande $* e $@ em A B C D. Assim, separadas por espaço.
A diferença é quando eles estão entre " " ou ' ', como foi dito. Nesse caso, o bahs expande da seguinte forma:
"$*" ---> "A B C D"
"$@" ---> "A" "B" "C" "D"

Acho que assim fica mais claro o que acontece.

Espero ter ajudado.
Leonardo Fedalto


8. in no for

Leonardo Fedalto
Eagle

(usa Slackware)

Enviado em 15/07/2006 - 02:24h

Olá vuln.

No exemplo dado:
for x in "$@"; do
echo $x
done

o in é necessário para dizer que a variável x assumirá todos os valores depois de in.
Assim, nesse exemplo, a variável x assume o valor de cada argumento passado ao script a cada interação.
Assim, se os argumentos passados ao script forem A, B e C, na primeira interação do for a variável x assume o valor A, na segunda interação o valor B e na terceira o valor C.

Diferente quando você utiliza um redirecionamento. Nesse caso o in não é usado. Como exemplo, reproduzindo o mesmo resultado:
echo "$@" | for x ; do
echo $x
done

Nesse caso a variável x assume os valores redirecionados pelo pipe.

Espero ter ajudado.
Leonardo Fedalto






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts