Apanhando feito um condenado...porque o bash nao interpreta minha variavel ?

1. Apanhando feito um condenado...porque o bash nao interpreta minha variavel ?

MAURICIO MARTINS DA CUNHA
mcunha98_br

(usa CentOS)

Enviado em 27/02/2020 - 12:06h

Pois é...deveria ser uma tarefa simples.

Meu script requer 1 parametro (recebido via $1), porem nao consigo fazer ele ser interpretado para o proximo passo/execucao.
Fiz 16 formas diferentes e nenhuma da certo (vale lembrar que ha aspas simples/duplas nas cadeias de execucao).


#!/bin/bash

if [ "$1" != "" ]; then
echo "Executando consulta do cartao $1"
query="select concat('Serial: ', serial_aparelho, ', Creditos:', creditos_aparelho, ' ,Resgatado: ', status_resgatado_aparelho, if(status_resgatado_aparelho = 0,' - Sim',' - Nao')) as saida from tbl_aparelho where serial_aparelho = "$1"';
echo "Executando $query"
cmd="mysql --database=erp --execute='$query'"
echo "Executando comando $cmd"
eval $cmd
else
echo "Chamada invalida, execute este script passando o serial do cartao que deseja consultar"
echo "Exemplo: cartao.sh 38933NB3"
echo "Importante : o cartao e passar o parametro em maiusculo"
fi





  


2. Re: Apanhando feito um condenado...porque o bash nao interpreta minha variavel ?

Cézar Augusto
Cizordj

(usa Debian)

Enviado em 27/02/2020 - 16:11h

Bom eu copiei e colei o código-fonte e no meu mostra um erro de sintaxe.

[email protected]:~$ ./teste.sh  Cezar
./teste.sh: linha 13: encontrado EOF inesperado enquanto procurava por `"' correspondente
./teste.sh: linha 16: erro de sintaxe: fim prematuro do arquivo

Eu creio que essa variável query é o que está estragando o script, ela é muito grande e cheia de aspas e if's... Pode ser que o interpretador fique confuso nessa hora.

________________________________________________
O programador tem a mania de achar que tudo é objeto


3. Re: Apanhando feito um condenado...porque o bash nao interpreta minha variavel ?

Cézar Augusto
Cizordj

(usa Debian)

Enviado em 27/02/2020 - 16:17h

Agora deu certo!
[email protected]:~$ ./teste.sh Cezar
Executando consulta do cartao Cezar
Executando select concat('Serial: ', serial_aparelho, ', Creditos:', creditos_aparelho, ' ,Resgatado: ', status_resgatado_aparelho, if(status_resgatado_aparelho = 0,' - Sim',' - Nao')) as saida from tbl_aparelho where serial_aparelho =Cezar;
Executando comando

O problema estava na variável "query", ela tinha aspas sobrando. Em todas as linguages de programação que eu trabalho, quando a string é muito complexa eu separo ela em variáveis diferentes e no final eu junto elas todas para compor a consulta final do banco de dados e foi o que eu fiz com o seu código. Aparentemente deu certo!

#!/bin/bash

if [ "$1" != "" ]; then
echo "Executando consulta do cartao $1"
query="select concat('Serial: ', serial_aparelho, ', Creditos:', creditos_aparelho, ' ,Resgatado: ', status_resgatado_aparelho, if(status_resgatado_aparelho = 0,' - Sim',' - Nao')) as saida from tbl_aparelho where serial_aparelho = "
query2=$1";"
echo "Executando $query$query2"
cmd="mysql --database=erp --execute='$query$query2'"
echo "Executando comando $cmd"
eval $cmd
else
echo "Chamada invalida, execute este script passando o serial do cartao que deseja consultar"
echo "Exemplo: cartao.sh 38933NB3"
echo "Importante : o cartao e passar o parametro em maiusculo"
fi


________________________________________________
O programador tem a mania de achar que tudo é objeto


4. Re: Apanhando feito um condenado...porque o bash nao interpreta minha variavel ?

MAURICIO MARTINS DA CUNHA
mcunha98_br

(usa CentOS)

Enviado em 02/03/2020 - 09:21h

Cezar

Primeiramente obrigado pela resposta/interesse.

O problema é que funcionou porem com uma formatação inválida pois o parametro recebido via shell deve ficar entre aspas simples e ai a coisa desanda de novo...

[email protected]:/app# ./cartao.sh 3893SNB3
Executando consulta do cartao 3893SNB3
Executando comando mysql --database=erp_ --execute='select concat('Serial: ', serial_aparelho, ', Creditos:', creditos_aparelho, ' ,Resgatado: ', status_resgatado_aparelho, if(status_resgatado_aparelho = 0,' - Sim',' - Nao')) as saida from tbl_aparelho where serial_aparelho=3893SNB3;'


Mesmo passando query2 com aspas simples para $1 eu continuo não tendo o comando executado, mas acredito que não se trata do script e sim do mysql, vou tentar achar referencias melhores sobre executado de comando desse padrao nele (talvez salvar em um .sql e tornar ele parametro com < na execução, algo como mysql < /tmp/meucomando.sql


query2="$1;"
#o correto seria:
query2="'$1';"


Há ainda de se observar que mysql suporta outro caracter no lugar de aspas simples/duplas, talvez tentar com ele para ver se resolve.
Mais uma vez obrigado, quando resolver posto aqui para compartilhar com os demais



5. Re: Apanhando feito um condenado...porque o bash nao interpreta minha variavel ?

Cézar Augusto
Cizordj

(usa Debian)

Enviado em 04/03/2020 - 22:53h

O outro caractere seria o acento grave `

o problema é que o shell também interpreta o acento grave como se fosse uma função, então:
~$ ./script.sh `meu parametro`  

será a mesma coisa que
~$ ./script.sh $(meu parametro) 


Agora se quiser mandar o acento grave de maneira literal, terás que pôr entre aspas simples

[email protected]:~$ echo '`meu parametro`'
`meu parametro`

________________________________________________
O programador tem a mania de achar que tudo é objeto






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts