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

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

Re: [shell-script] Criar variaveis através de um loop/Array


From: Rodrigo Cunha
Subject: Re: [shell-script] Criar variaveis através de um loop/Array
Date: Mon, 6 Apr 2015 12:06:42 -0300

A diferença de tempo de execução foi gritante.
Veja, criei um arquivo com 10 mil linhas e fiz o mesmo procedimento em ambos os casos para o script:
root@pc-casa:/STORAGE/git.d/shell.d/Snif alias# cat deposito.lista-ip.txt|wc
  10000   10000   48894
root@pc-casa:/STORAGE/git.d/shell.d/Snif alias#

Script 1 :
#!/bin/bash
#Autor Rodrigo Silva
contador=$(cat deposito.lista-ip.txt |wc|awk '{print $1}')
for linha in $(cat deposito.lista-ip.txt)
do
aux=( ${aux[@]} $linha )
done

for (( i=0; i<=$contador; i++ ))
do
echo ${aux[$i]}
done

Script2 :

#!/bin/bash
#Autor Rodrigo Silva
contador=($(cat  deposito.lista-ip.txt))
echo  ${contador[@]}

Tempo de execução do script 1 :
real    1m8.223s
user    1m8.046s
sys    0m0.179s
Tempo de execução do script 2 :
real    0m0.035s
user    0m0.026s
sys    0m0.011s


Em 6 de abril de 2015 10:17, Rodrigo Cunha <address@hidden> escreveu:
Valeu Júlio, vou fazer o teste e posto aqui.
Obrigado srs.

Em 5 de abril de 2015 21:13, 'Julio C. Neves' address@hidden [shell-script] <address@hidden> escreveu:
 

Fala Rodrigo,
se eu entendi, vc deseja colocar uma variável como índice de um vetor. Isso é simples, basta vc fazer echo ${vet[var]}. Não precisa sequer do $ precedendo a variável, pois a interpretação feita dentro dos colchetes é sempre matemática. Vc pode por exemplo fazer echo ${vet[3*2]} que ele listará vet[6].

$ vet=({a..m})
$ echo ${vet[@]}
a b c d e f g h i j k l m
$ echo ${vet[3*2]}
g
$ echo ${vet[2+1]}
d

Olha:

$ unset var           # Matei var
$ echo ${vet[1+var]}  # Como var não existe, será substituída por zero para evitar erro
b
$ echo $var           # Ainda não existe

$

Agora o mais importante: o processo que vc usou para criar o vetor foi o pior possível. Existem outros bem melhores:
1.===================
$ vet=($(cat  list-snif-alias.sh))

2.===================
$ read -a vet < list-snif-alias.sh

3.===================
A partir do Bash 4.0 foi introduzido o builtin map file que lê direto de um arquivo para um vetor. Esse processo é disparado o mais veloz e mais eficiente de todos os outros
$ mapfile vet < list-snif-alias.sh

Se esse teu arquivo tem mais de 100 registros, por favor meça o tempo das soluções (incluindo a sua) e coloque aqui na lista para todos verem e aprenderem esse macete.

Abcs,
Julio
@juliobash
P
róximos cursos de Shell
Cidade         Local Período
Rio de Janeiro EDX 04 a 08/05/15
São Paulo 4Linux 15 a 19/06/15
São Paulo 4Linux 03 a 07/08/15
São Paulo 4Linux 07 a 11/12/15

Dou treinamento de Shell em qualquer cidade.
Para mais detalhes, me mande um e-mail.


Em 5 de abril de 2015 16:42, Rodrigo Cunha address@hidden [shell-script] <address@hidden> escreveu:
 

funcionou legal, como eu faço para jogar um loop aqui para uma hipotética variavel $x no lugar do numero 1.

echo ${aux$[x]}

:(, no meu caso eu preciso usar o loop para uma posterior execução de um acesso ssh para cada ip cadastrado.


Em 5 de abril de 2015 16:13, Rodrigo Cunha <address@hidden> escreveu:
Vlw Robson, vou testar e te aviso.
:)

Em 5 de abril de 2015 13:07, Robson Alexandre address@hidden [shell-script] <address@hidden> escreveu:
 

Rodrigo,

Nesse caso é melhor usar o array mesmo. Substitua o script por

for linha in $(cat list-snif-alias.sh)
do
aux=( ${aux[@]} $linha )
done

e cada posição que vc queira acessar é só fazer:
echo ${aux[1]}


Atenciosamente
Robson Alexandre





Em dom, 5 de abr de 2015 às 11:02, Rodrigo Cunha address@hidden [shell-script] <address@hidden> escreveu:
 

Olá srs, estou criando um script que cria uma variavel para cada ip de um arquivo.
Pensei em duas opções, criar um array ou criar um loop com o for para o numero de linhas do arquivo.
Exemplo :
Nome do arquivo : list-snif-alias.sh
cat  list-snif-alias.sh
192.168.0.10
192.168.0.11
Script :
#!/bin/bash
contador=$(cat list-snif-alias.sh |wc|awk '{print $1}')
export contador
for (( i=1; i<=$contador; i++ ))
do
aux_${i}=$(head -n${i} list-snif-alias.sh |tail -1)
echo $aux_${i}
done
echo ""

O problema é que meu retorno, ao invés de exibir apenas o ip contido dentro da variavel, ele me retorna um resultado diferente :

./evento.leararquivo.sh: line 8: aux_1=192.168.0.10: command not found
1
./evento.leararquivo.sh: line 8: aux_2=192.168.0.11: command not found
2






--
Atenciosamente,
Rodrigo da Silva Cunha




--
Atenciosamente,
Rodrigo da Silva Cunha




--
Atenciosamente,
Rodrigo da Silva Cunha





--
Atenciosamente,
Rodrigo da Silva Cunha




--
Atenciosamente,
Rodrigo da Silva Cunha


reply via email to

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