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: Julio C. Neves
Subject: Re: [shell-script] pegar ultimo param em lista de tam indeterminado
Date: Thu, 13 Nov 2014 16:15:23 -0200

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]