Variável com saída de um comando

13. Re: Variável com saída de um comando

Caroline Kieling
Kieling

(usa CentOS)

Enviado em 22/06/2017 - 14:46h

Acho que esqueci de um detalhe que talvez seja bem importante!

Este é um script que precisa ser executado por qualquer usuário e, para isso, tive que colocar um "sudo -s -- <<EOF" no início. Apenas colocando um sudo -s em cada comando não resolveu.

Enfim, não faço ideia do que fazer. Tenho outros scripts com essa mesma sintáxe "variavel=`comando`" e até então sempre funcionou .-.


  


14. Re: Variável com saída de um comando

Caroline Kieling
Kieling

(usa CentOS)

Enviado em 22/06/2017 - 14:51h

plimo263 escreveu:
Ah sim, tentou colocar o caminho completo dos executaveis ?

nroLinhas=`/bin/cat /temp/result-envia-tabela| /bin/grep 'rows'| /usr/bin/cut -d " " -f1| /usr/bin/tail -1`


Testei aqui e não deu...

To achando que é o meu "sudo -s <<EOF" que está causando isso

Só não sei como resolver e se o tiro dali ganho mais problemas :(


15. Re: Variável com saída de um comando

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/06/2017 - 15:04h

Kieling escreveu:
To achando que é o meu "sudo -s <<EOF" que está causando isso

Só não sei como resolver e se o tiro dali ganho mais problemas :(


Kieling, tem algo estranho no seu script . . .
O comando:
N=$(awk '/rows/{print $1}' result.txt |tail -1)
user@debian:~$ echo $N
2
Roda a contento no terminal.
result.txt é o arquivo q vc forneceu...
Poste o script inteiro...

marcelo oliver






16. Re: Variável com saída de um comando

Caroline Kieling
Kieling

(usa CentOS)

Enviado em 22/06/2017 - 15:44h

msoliver escreveu:

Kieling escreveu:
To achando que é o meu "sudo -s <<EOF" que está causando isso

Só não sei como resolver e se o tiro dali ganho mais problemas :(


Kieling, tem algo estranho no seu script . . .
O comando:
N=$(awk '/rows/{print $1}' result.txt |tail -1)
user@debian:~$ echo $N
2
Roda a contento no terminal.
result.txt é o arquivo q vc forneceu...
Poste o script inteiro...

marcelo oliver





O script inteiro tem 300 linhas .-.

Em resumo, ele pede ao usuário que informe a tabela e o servidor de destino. Depois ele testa as respostas e encontra o banco que essa tabela pertence. Ele também fornece algumas dicas e monta um script .sql que é executado e faz o envio das tabelas.
Ao executar, jogo a saída no /temp/result-envia-tabela e faço diversos testes sobre os diversos erros e exibo ao usuário.

Vou postar o código da parte em que começa o EOF e que contém o meu problema omitindo os echos para poupar espaço.
sudo -s -- <<EOF 
sudo cat /temp/result-envia-tabela |grep "time-out" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "cannot find the specified database" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "invalid column" > /temp/result-e-u-grep
sudo cat /temp/result-envia-tabela |grep "incomplete SQL statement input" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "table or view does not exist" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "ERROR" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`
if [ "${nroLinhas}" = "0" ]; then
...
else
...
fi
fi
fi
fi
fi
fi
EOF


Lembrando que já tentei substituir essa última parte por todas as sugestões:
#                                       nroLinhas=`/bin/cat /temp/result-envia-tabela| /bin/grep 'rows'| /usr/bin/cut -d " " -f1| /usr/bin/tail -1`
# nroLinhas=$(awk '/rows/{print $1}' /temp/result-envia-tabela |tail -1)
# nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`
# for nroLinhas in `cat /temp/result-envia-tabela |grep "rows"|cut -d " " -f1|tail -1`
# cat /temp/result-envia-tabela|grep 'rows'|cut -d " " -f1|tail -1|
# while read nroLinhas
# do
echo "Valor da minha variável: ${nroLinhas}!"

if [ "${nroLinhas}" = "0" ]; then
echo ""
echo "ERRO: Esta operacao ja foi realizada ou alguma das informacoes inseridas no filtro esta incorreta."
echo ""
echo "----------------------------------------------------------------------------------------------------"
echo ""
else
echo ""
echo "Obrigada! As informacoes selecionadas da tabela \"${table}\" foram enviadas do banco \"${bancoo}\" para \"${bancod}\"."
echo "------------------------------------------------------------------------------------------"
echo ""
echo ""
fi
# done
fi
fi
fi
fi
fi
EOF



17. Re: Variável com saída de um comando

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/06/2017 - 16:19h

Kieling escreveu:

msoliver escreveu:

Kieling escreveu:
To achando que é o meu "sudo -s <<EOF" que está causando isso

Só não sei como resolver e se o tiro dali ganho mais problemas :(


Kieling, tem algo estranho no seu script . . .
O comando:
N=$(awk '/rows/{print $1}' result.txt |tail -1)
user@debian:~$ echo $N
2
Roda a contento no terminal.
result.txt é o arquivo q vc forneceu...
Poste o script inteiro...

marcelo oliver


O script inteiro tem 300 linhas .-.

Em resumo, ele pede ao usuário que informe a tabela e o servidor de destino.
Depois ele testa as respostas e encontra o banco que essa tabela pertence.
Ele também fornece algumas dicas e monta um script .sql que é executado e faz o envio das tabelas.
Ao executar, jogo a saída no /temp/result-envia-tabela e faço diversos testes sobre os diversos erros e exibo ao usuário.

Vou postar o código da parte em que começa o EOF e que contém o meu problema omitindo os echos para poupar espaço.
#sudo -s -- <<EOF 
sudo cat /temp/result-envia-tabela |grep "time-out" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "cannot find the specified database" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "invalid column" > /temp/result-e-u-grep
sudo cat /temp/result-envia-tabela |grep "incomplete SQL statement input" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "table or view does not exist" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
sudo cat /temp/result-envia-tabela |grep "ERROR" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`
if [ "${nroLinhas}" = "0" ]; then
...
else
...
fi
fi
fi
fi
fi
fi
EOF


Lembrando que já tentei substituir essa última parte por todas as sugestões:
#                                       nroLinhas=`/bin/cat /temp/result-envia-tabela| /bin/grep 'rows'| /usr/bin/cut -d " " -f1| /usr/bin/tail -1`
# nroLinhas=$(awk '/rows/{print $1}' /temp/result-envia-tabela |tail -1)
# nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`
# for nroLinhas in `cat /temp/result-envia-tabela |grep "rows"|cut -d " " -f1|tail -1`
# cat /temp/result-envia-tabela|grep 'rows'|cut -d " " -f1|tail -1|
# while read nroLinhas
# do
echo "Valor da minha variável: ${nroLinhas}!"

if [ "${nroLinhas}" = "0" ]; then
echo ""
echo "ERRO: Esta operacao ja foi realizada ou alguma das informacoes inseridas no filtro esta incorreta."
echo ""
echo "----------------------------------------------------------------------------------------------------"
echo ""
else
echo ""
echo "Obrigada! As informacoes selecionadas da tabela \"${table}\" foram enviadas do banco \"${bancoo}\" para \"${bancod}\"."
echo "------------------------------------------------------------------------------------------"
echo ""
echo ""
fi
# done
fi
fi
fi
fi
fi
EOF


Não é a solução para o problema apresentado, mas, para otimizar o código.
Ao invés de:
cat /temp/result-envia-tabela |grep "time-out" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then . . .

Faça:
if grep "time-out" /temp/result-envia-tabela;then . . . else . . . fi  


Quanto ao "erro" . . .
sudo cat /temp/result-envia-tabela |grep "ERROR" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`

Só vai gerar a var nroLinhas, se /temp/result-e-u-grep NÃO for MAIOR que ZERO.....
Att.:
Marcelo Oliver



18. Re: Variável com saída de um comando

Caroline Kieling
Kieling

(usa CentOS)

Enviado em 22/06/2017 - 17:00h

msoliver escreveu:

Não é a solução para o problema apresentado, mas, para otimizar o código.
Ao invés de:
cat /temp/result-envia-tabela |grep "time-out" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then . . .

Faça:
if grep "time-out" /temp/result-envia-tabela;then . . . else . . . fi  


Quanto ao "erro" . . .
sudo cat /temp/result-envia-tabela |grep "ERROR" > /temp/result-e-u-grep
if [ -s /temp/result-e-u-grep ]; then
...
else
nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`

Só vai gerar a var nroLinhas, se /temp/result-e-u-grep NÃO for MAIOR que ZERO.....
Att.:
Marcelo Oliver


Muito obrigada pelas sugestões, já apliquei aqui!!!

Quanto a parte "Só vai gerar a var nroLinhas, se /temp/result-e-u-grep NÃO for MAIOR que ZERO.....", sim, é isso que quero.

Todos os testes anteriores verificam se há algum erro e jogam esse erro neste arquivo (burrice minha, era só otimizar como você mostrou). Portanto, se há erro há o /temp/result-e-u-grep. Se não houver erros ele gera a var. Assim, se o número de linhas inseridas na tabela for igual a 0 (significa que nada foi copiado), eu aviso que nada foi copiado. Caso contrário, aviso que deu tudo certo =D

Se você tiver alguma idéia pra otimizar ou fazer funcionar essa última parte...

O que eu preciso:

1- Ler o arquivo /temp/result-envia-tabela
2-Achar a linha que contém a palavra "rows"
3-Pegar a primeira coluna desta linha (meu número)
4-Armazenar este número em uma variável

Valeu!!!


19. Re: Variável com saída de um comando

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 22/06/2017 - 17:36h

Kieling escreveu:
1- Ler o arquivo /temp/result-envia-tabela
2-Achar a linha que contém a palavra "rows"
3-Pegar a primeira coluna desta linha (meu número)
4-Armazenar este número em uma variável

Valeu!!!


Testando aqui, no terminal, funciona . . .
if grep -q 'ERROR' result.txt ;then
echo "EXISTE ERRO"
else
echo "NÃO HÁ ERROS";NL=$(awk '/rows/ {print $1}' result.txt);echo "NL:$NL"
fi
cat result.txt
>>>>> read COMMANDS of SCRIPT FILE: envia-tabela.sql <<<<<

dmSQL> connect to cotripaldb0_desenv;
USE db #1 connected to db:<cotripaldb0_desenv> by user:<SYSADM>

dmSQL> insert or replace into af0000_dat select * from cotripaldb0:af0000_dat;
2 rows affected

dmSQL> quit;

>>>>> end of SCRIPT FILE: envia-tabela.sql <<<<<
USE db #1 disconnected from db:<cotripaldb0_desenv> by user:<SYSADM>

Testei tbem inserindo a string "ERROR" em result.txt.

att.:
mso


20. Re: Variável com saída de um comando

Caroline Kieling
Kieling

(usa CentOS)

Enviado em 23/06/2017 - 17:49h

msoliver escreveu:

Testando aqui, no terminal, funciona . . .
if grep -q 'ERROR' result.txt ;then
echo "EXISTE ERRO"
else
echo "NÃO HÁ ERROS";NL=$(awk '/rows/ {print $1}' result.txt);echo "NL:$NL"
fi
cat result.txt
>>>>> read COMMANDS of SCRIPT FILE: envia-tabela.sql <<<<<

dmSQL> connect to cotripaldb0_desenv;
USE db #1 connected to db:<cotripaldb0_desenv> by user:<SYSADM>

dmSQL> insert or replace into af0000_dat select * from cotripaldb0:af0000_dat;
2 rows affected

dmSQL> quit;

>>>>> end of SCRIPT FILE: envia-tabela.sql <<<<<
USE db #1 disconnected from db:<cotripaldb0_desenv> by user:<SYSADM>

Testei tbem inserindo a string "ERROR" em result.txt.

att.:
mso


Sim, no terminal funciona. Fazendo outro script com essa última parte também funciona. O que não funciona é colocá-lo dentro do EOF. Para caráter de teste, copie e cole o código que te mandei (com o EOF) e o execute... Não há atribuição de valor para a variável nroLinhas.

Como não pude encontrar alguma forma mais inteligente, menos gambiarra.com.br, para resolver o problema resolvi tirar do script os trechos que tinham o EOF e, para compensar a falta do mesmo, fiz com que todo o script fosse executado em uma subshell com permissões de root.

Bem gambiarra isso, mas beleza.
Vou criar um outro tópico mais específico pra evitar a confusão. O que eu realmente quero saber é como fazer com que a minha variável consiga ser carregada mesmo estando em um EOF.



21. Re: Variável com saída de um comando

Caroline Kieling
Kieling

(usa CentOS)

Enviado em 23/06/2017 - 17:54h

Me explicando melhor:

Este carrega a variável:
nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`

if [ "${nroLinhas}" = "0" ]; then
echo ""
echo "ERRO: Nao foi possivel realizar o insert. Provavelmente, alguma das informacoes inseridas no filtro esta incorreta."
echo ""
echo "----------------------------------------------------------------------------------------------------"
echo ""
else
echo ""
echo "Obrigada! As informacoes selecionadas da tabela \"${table}\" foram enviadas do banco \"${bancoo}\" para \"${bancod}\"."
echo "------------------------------------------------------------------------------------------"
echo ""
echo ""
fi



Este não:
sudo -s -- <<EOF
nroLinhas=`grep rows /temp/result-envia-tabela|cut -d " " -f1|tail -1`

if [ "${nroLinhas}" = "0" ]; then
echo ""
echo "ERRO: Nao foi possivel realizar o insert. Provavelmente, alguma das informacoes inseridas no filtro esta incorreta."
echo ""
echo "----------------------------------------------------------------------------------------------------"
echo ""
else
echo ""
echo "Obrigada! As informacoes selecionadas da tabela \"${table}\" foram enviadas do banco \"${bancoo}\" para \"${bancod}\"."
echo "------------------------------------------------------------------------------------------"
echo ""
echo ""
fi
EOF





01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts