shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] pegar ultimo param em lista de tam indeterminado


From: Herbert Parentes Fortes Neto
Subject: Re: [shell-script] pegar ultimo param em lista de tam indeterminado
Date: Thu, 13 Nov 2014 16:36:24 -0200

email arquivado.

obrigado!

Em Qui, 2014-11-13 às 16:15 -0200, 'Julio C. Neves'
address@hidden [shell-script] escreveu:
>   
> Fala Herbert,
> naquela altura do livro eu não tinha ensinado nem o for nem o eval,
> então vc apelou ;). Mas vamos ver o seu exemplo passando 3 parâmetros,
> sendo que um deles tem espaços em branco.
> 
> $ set parm1 parm2 "parâmetro três"  # passando 3 parâmetros para o
> Shell
> $ for i in $@
> > do
> > continue
> > done
> $ echo "o ultimo parâmetro é: $i"
> o ultimo parâmetro é: três  # Resultado errado
> 
> $ for i in "$@"   #$@ entre aspas
> > do
> > continue
> > done
> $ echo "o ultimo parâmetro é: $i"
> o ultimo parâmetro é: parâmetro três # Resultado correto.
> 
> 
> Nessa parte do livro, disse que $* e $@ eram quase igual mas veríamos
> a diferença no capítulo 7 qdo falássemos de arrays, isto é, tb não
> havia explicado o uso correto de $@
> 
> 
> Ora, vc sabe que $# tem a qtde de parâmetros passado então para listar
> o último a primeira vontade que dá é fazer:
> 
> 
> $ echo $`echo $#`
> 
> 
> Supondo que passei 3 parâmetros a minha esperança é que as crases
> dessem prioridade de execução ao `echo $#`, que retornaria 3 e em
> seguida faria um echo $3 que retornaria parâmetro três, mas veja:
> 
> $ echo $`echo $#`
> $3
> 
> 
> Isso ocorreu, pq na fase de resolução de variáveis existia somente uma
> variável que era $#, qdo o interpretador termina cada fase, não volta
> mais nela. O cmd eval é justamente para isso, ele obriga duas passadas
> no cmd. Na primeira ela avalia (evaluate) o que pode e na segunda
> executa. Assim sendo, na 1ª passada o eval gerou echo $3 e na 2ª
> executou este cmd, Veja:
> 
> $ eval echo $`echo $#`
> parâmetro três
> 
> 
> Isso ficaria melhor escrito se fosse:
> 
> $ eval echo \$$#
> parâmetro três
> 
> 
> 
> Repare que echo \$$# tb gera $3 então é só dar outra passada. Já que é
> para fazer como ainda não ensinei, vc tb poderia ter feito:
> 
> $ echo ${!#}
> parâmetro três
> 
> 
> E essa não vou explicar pq isso já tá muito grande. O que eu esperava
> que vc fizesse naquele momento, com as ferramentas que já tinha
> ensinado era:
> 
> 
> $ Shf=$(($#-1))
> 
> $ shift $Shf
> 
> $ echo $1
> parâmetro três
> 
> 
> ou, abreviando,
> 
> 
> 
> $ shift $(($# - 1))
> 
> $ echo $1
> 
> 
> 
> 
> Abcs,
> Julio
> @juliobash
> Próximos cursos de Shell
> Cidade         Local Período
> 
> Rio de Janeiro EDX 10 a 14/11
> São Paulo 4Linux 24 a 28/11
> Dou treinamento de Shell em qualquer cidade.
> Para mais detalhes, me mande um e-mail.
>         > 
> 
> 
> Em 13 de novembro de 2014 15:06, Herbert Parentes Fortes Neto
> address@hidden [shell-script] <address@hidden>
> escreveu:
>           
>         Olá,
>         
>         estou tentando pegar o último parâmetro passado a um script.
>         exercício do livro do Júlio.
>         
>         fiz de duas formas:
>         
>         #!/bin/bash
>         
>         for i in $@
>         do
>         continue
>         done
>         echo "o ultimo parâmetro é: $i"
>         
>         var="$(eval echo \$$(echo $#))"
>         echo "o último parâmetro esta em var = $var"
>         
>         exit 0
>         
>         usei o 'eval' mesmo ele não sendo muito claro para mim.
>         
>         tem outras formas de fazer isso?
>         
>         abraço,
>         
>         
>         
>         
> 
> 
> 
-- 
Herbert Parentes Fortes Neto (hpfn)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]