[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Res: [shell-script] Exportar resultado de função
From: |
Felipe Rodrigues Maia |
Subject: |
Res: [shell-script] Exportar resultado de função |
Date: |
Sun, 22 Aug 2010 10:01:27 -0700 (PDT) |
Boa tarde Cristiano.
Você não consegue obter o valor das variáveis da função que você definiu
justamente por elas serem visíveis apenas localmente (dentro da função). Você
pode escrever as funções para retornarem um valor, e posteriormente "alimentar"
uma variável, em local visível e apropriado.
Uma forma um pouco mais elegante e "reutilizável" de fazer isso seria:
######################################
--- Arquivo lib.sh
#!/bin/bash
function getPorta(){
grep '^'${1}';' /etc/firewall/services.conf | cut -f 2 -d ';'
}
function getProtos(){
grep '^'${1}';' /etc/firewall/services.conf | cut -f 3 -d ';'
}
-----
--- Arquivo exec.sh
#!/bin/bash
source lib.sh ; #Importa as funções e variáveis globais definidas em outro
arquivo.
function execIptables(){
PORTA=$(getPorta ${1});
PROTOS=$(getProtos ${1});
for PROTO in $(echo $PROTOS) ; do
echo "iptables -A FORWARD -p $PROTO --dport $PORTA -i $IF_IN -j DROP";
done
}
### Testes --
echo -e "Teste DNS:\n $(execIptables "DNS") "
echo -e "Teste BACULA_DIR:\n $(execIptables "BACULA_DIR") "
-----
######################################
Mais interessante ainda seria se você conseguisse definir uma função para fazer
apenas um "grep", utilizando um "read" e separando pelo delimitador ';'. Daí
seria possível fazer tudo isso em uma linha só, dentro de um loop "for". Dei
uma
olhada bem rápida aqui nos manuais do linux e não consegui ver se é possível
fazer o read utilizar delimitadores. Mas com um pouquinho mais de pesquisa acho
que é possível.
Um abraço,
Felipe Rodrigues Maia
address@hidden
________________________________
De: Cristiano <address@hidden>
Para: address@hidden
Enviadas: Sábado, 21 de Agosto de 2010 11:47:37
Assunto: [shell-script] Exportar resultado de função
Senhores, bom dia.
Estou otimizando um script de firewall e tenho um arquivo que descreve serviços
e portas.
Seu conteúdo é +- assim:
BACULA_DIR;9101;tcp udp
BACULA_FD;9102;tcp udp
BACULA_SD;9103;tcp udp
DNS;53;tcp udp
FIREBIRD;3050;tcp
FTP;20:21;tcp
GMAIL_POP;995;tcp
A ideia é criar uma função que receba como parâmetro o nome do serviço (campo
1)
e que retorne a porta (campo 2) e os protocolos (campo 3), atribuídos
respectivamente à variáveis PORTA e PROTOS.
Porém, a atribuição da variável feita dentro da função não é exportada para o
shell que a chamou.
Como eu faço para usar estas variáveis, atribuídas dentro da função, fora
delas.
Exemplo:
function GetService () {
PORTA=$(grep '^'${1}';' /etc/firewall/services.conf | cut -f 2 -d ';')
PROTOS=$(grep '^'${1}';' /etc/firewall/services.conf | cut -f 3 -d ';')
}
# (...)
GetService "DNS"
for PROTO in $(echo $PROTOS) ; do
iptables -A FORWARD -p $PROTO --dport $PORTA -i $IF_IN -j DROP
done
Sei que a dúvida conceitual é bem básica; até meio besta, mas me deu um branco.
[As partes desta mensagem que não continham texto foram removidas]