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

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

Re: [shell-script] Re: Dúvida com variáveis


From: Julio C. Neves
Subject: Re: [shell-script] Re: Dúvida com variáveis
Date: Tue, 13 Nov 2012 10:50:51 -0200

Em 12 de novembro de 2012 22:57, Cristiano <address@hidden> escreveu:

> **
>
>
>
>
> --- Em address@hidden, Pedro Renato Martelotta <het_net@...>
> escreveu
> >
> > Pessoal,
> >
> > Estava fazendo um script para enviar um arquivo para vários servidores. A
> > dúvida é: como ler uma variével dentro de outra?
> > Segue uma parte do código (está errado, é só pra clarear a dúvida):
> >
> > ...
> > *# Lista de servidores a receber o arquivo (13 servidores)
> > SVR1=servidor20
> > ...
> > SVR12=servidor28
> > SVR13=servidor50
> >
> > # Localização do arquivo
> > ARQ=/root/arquivo.txt
> >
> > # Envio via SCP
> > for i in $(seq 13)
> > do
> > CONT=SVR${i}
> > echo "Digite a senha para o servidor ${CONT}"
> > scp ${ARQ} ${CONT}:/root/
> > sleep 1
> > done*
> >
> > Antes disso, tinha pensado em ${SVR${i}}, mas não funciona. Alguém
> entendeu
> > o que quis fazer e poderia me ajudar?
> >
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
>

Pedro vamulá! ;)

Acho que vc quer fazer é o seguinte:

$ v1=aaaa
$ var=v
$ num=1
$ echo \$$var$num
$v1
#  Escreveu o nome da variável mas não a resolveu. Para
#+ dar uma passada e, dessa forma trocar o nome da variável
#+ por seu conteúdo é que se usa o cmd eval. Veja:
$ eval echo \$$var$num
aaaa

Outra forma de fazer o mesmo seria usando a expansão de parâmetros ba
seguir, que creio só funcionar após o bash 3.0:

$ var1=$var$num
$ echo ${!var1}
aaaa

Pedro, mostrei essas formas de fazer só para vc ver que no shell tudo
funciona, mas se eu fosse vc, faria o que o Cristiano está propondo logo a
seguir.

Cristiano, arrays existem em Shell há muito tempo e só não funcionam no
Bourne shell (sh), que é mais velho que o rascunho da bíblia. ;)

O Bash 4.0 passou a incorporar arrays associativos, que são aqueles cujo
índice é alfabético. Experimente:

$ declare -A bixos #;)
$ bixos[cavalo]=veloz
$ bixos[cachorro]=amigo
$ bixos[gato]=ágil
$ echo ${bixos[@]}
ágil amigo veloz
$ echo ${!bixos[@]}
gato cachorro cavalo
$ paste <(tr ' ' '\n' <<< ${bixos[@]}) <(tr ' ' '\n' <<< ${!bixos[@]})
ágil gato
amigo cachorro
veloz cavalo


 Pedro, boa noite.
>
> O que você está tentando fazer pode ser feito usando vetores (arrays).
> Porém, vetores não estão disponíveis para qualquer interpretador. Nem mesmo
> no bash eles existem em todas as versões (se não me falha a memória, só da
> 4.0 para frente).
>
> Mas fazer o que você quer é muito mais simples, usando o while e o
> redirecionamento de entrada (<). Deste modo, você não precisa definir
> variáveis no arquivo que relaciona os servidores. Basta listar os
> endereços, tipo:
>
> $ cat servidores.txt
> servidor1
> servidor2
> ...
> servidorN
>
> Com os arquivos nomeados linha por você pode fazer algo assim:
>
> ARQ=/root/arquivo.txt
> while read SERVER ; do
> echo "Digite a senha para o servidor ${SERVER}"
> scp ${ARQ} ${SERVER}:/root/
> sleep 1
> done < servidores.txt
>
> Outra maneira de fazer isso com o "for" seria lendo o conteúdo do mesmo
> arquivo servidores.txt (sem a atribuição de variáveis) à partir de uma
> subshell, tipo:
>
> ARQ=/root/arquivo.txt
> for SERVER in $(cat servidores.txt) ; do
> echo "Digite a senha para o servidor ${SERVER}"
> scp ${ARQ} ${SERVER}:/root/
> sleep 1
> done
>
> E, por fim, você consegue fazer isso sem ter que digitar senha, usando
> autenticação por par de chaves. Mas, para isso, teria que configurar cada
> servidor (/etc/ssh/sshd_config) para aceitar a autenticação por par de
> chaves, além de copiar, ao menos, a chave pública do usuário para o
> servidor de destino (em ~/.ssh).
>
> Talvez configurar isso dê tanto ou mais trabalho que copiar manualmente os
> arquivos. Entretanto, dependendo da recorrência da replica dos arquivos,
> vale a pena configurar o acesso por chaves (além de ser muito mais seguro
> que a autenticação por senha).
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]



reply via email to

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