Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

1. Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Victor Leandro
vlmoura

(usa Linux Mint)

Enviado em 08/08/2013 - 18:29h

Olá!
Sou novo no linux e estou com difuldade em exibir dinamicamente, dentro de um FOR, um parametro passado na chamada de um script.
Exemplo: Ao chamar o script teste.sh da seguinte forma "# ./teste.sh um dois tres" a saída seria: "um dois tres". Mas eu não posso chamar os parametros estaticamente com $1 $2 $3....preciso chamar dinamicamente.
Alguém tem alguma ideia de como fazer isso??

Segue código do script:

#!/bin/sh
#O laço do for é executado N vezes onde N = quantidade de parametros
for i in $(seq $#)
do
# Aqui eu imprimiria o valor dos parametros
# $i não serve pois, imprimi o valor do i e não do parametro
# Como fazer para imprimir o parametro??
done



  


2. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 08/08/2013 - 18:48h

É simples. Basta dar echo:


#!/bin/sh
echo $1 $2 $3



3. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Victor Leandro
vlmoura

(usa Linux Mint)

Enviado em 08/08/2013 - 19:44h

Mas então Renato, eu quero fazer isso dinamicamente. Dentro do for ter apenas uma linha. Na primeira execução do laço, eu imprimiria echo $1, na segunda echo $2 e assim sucescivamente mas queria que o numeral fosse dinamico. Algo do tipo echo $i onde i é incrementeado em cada laço do for.
Não queria ter que checar o i dentro do laço e dar o echo correspondente. A ideia seria mais ou menos isso:

for i in $(seq $#)
do
echo $i
done

So que echo $i imprimi o valor de i e eu queria imprimir o valor do parametro, tipo $1 $2 $3...

Imagine que eu quero imprimir 30 variáveis passadas no parametro. Ao invés de ter que chamar $1 $2 $3...${30} eu quero chamar um for que faça essa interação.

Entendeu?


4. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 08/08/2013 - 19:56h

Entendi. Depois d muito brincar, eis o código:


#!/bin/bash
echo "#!/bin/bash" > /tmp/teste.txt
for j in `seq 1 9`
do
echo "echo -n $j\ " | sed 's/'$j'/$'$j'/g' >> /tmp/teste.txt
done
. /tmp/teste.txt


Como o número d parâmetros vão de 1 a 9, não há necessidade d fazer mais do q isso...


5. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Victor Leandro
vlmoura

(usa Linux Mint)

Enviado em 08/08/2013 - 20:54h

É exatamente isso Renato. Valeu!!
Entendi a estratégia de enviar o código gerado para um arquivo e depois lê-lo.
Valeu cara! Abraço!!


6. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 09/08/2013 - 15:32h

Permitam-me discordar quanto a ser uma boa solução. Não há garantia alguma de que o arquivo externo será criado com sucesso (suonha que o arquivo já exista, por exemplo, pertencendo a outro usuário).

O shell tem um mecanismo para fazer esse tipo de coisa sem precisar de arquivos externos: o comando eval. Por exemplo.

#!/bin/sh
a=1
b=2
c=3
for p in a b c; do
eval "echo \$$p"
done


Como você vai trabalhar com parâmetros posicionais, você pode tentar algo como o seguinte (usando o bash).

#!/bin/bash

for ((i=1; i<=$#; i++)); do
eval "arg=\${$i}" # As chaves são necessárias se houver mais de 9 parâmetros

# ... usa $arg ...
done



7. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 11/08/2013 - 15:39h

paulo1205, muito legal o q vc postou, porém fiz os testes e não funcionou como deveria. Há algo q faltou quando vc postou o código?


8. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 12/08/2013 - 00:38h

Sim. Faltou no segundo exemplo um sinal de fechar parênteses. Já corrigi.

Além disso, porém, o exemplo que eu coloquei não fazia mesmo coisa alguma além de colocar cada um dos valores dos parâmetros posicionais na variável "arg". Como usá-la, depois de definida, é com vocês, não comigo.


9. Re: Capturar Parametro Dinamicamente Dentro do Loop [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 12/08/2013 - 08:50h

@paulo1205, com esse código q vc consertou, fiz um teste de acordo com o pedido do autor do tópico. Seria desta forma?


#!/bin/bash

for ((i=1; i<=$#; i++)); do
eval "arg=\${$i}" # As chaves são necessárias se houver mais de 9 parâmetros
echo $arg
done







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts