Posso resolver esse problema, mas não entendo por que isso acontece.
Minha tarefa é: (em ksh)
- 1º passo: Consultar um número de um banco de dados com sqlplus,
- 2º passo: Formate algum texto para um e-mail,
- 3º passo: envie um email com estes.
Esta é uma parte do meu código:
psnr() {
sqlplus -s USR/PASS@PROD << EOS
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
select max_number-last_number from postalslip
where state = 'OPEN'
/
exit
/
EOS
}
Recebi um número, 1234567, quando chamo esta função.
PSNR=$(psnr)
Escrevo uma palavra para um e-mail:
echo "Today's result is: $PSNR" > $MAILTMP
se eu quiser usar essa variávelMAILTMPDevo usar tr -d '\040\011'
o que encontrei aqui, no stackexchange, pois o resultado sem tr será esse:
od -c mailtmp.17872.txt
0000000 T o d a y ' s r e s u l t i
0000020 s : \t 1 2 3 4 5
0000040 6 7 \n
0000043
Essa aba '\t' é o que não entendo: de onde vem, do sqlplus? Possivelmente especificidade do banco de dados? (Eu verifiquei no TOAD, ambas as colunas são números (18). Talvez a função em ksh tenha alguns recursos especiais?
Responder1
Também me deparei com esse espaço em branco indesejado ao trabalhar com um banco de dados diferente. Claramente, scripts de shell e ferramentas como SQLPlus são errados para extrair dados de bancos de dados, mas há ocasiões em que isso é conveniente.
Minha solução é retirar os espaços em branco iniciais e finais do resultado:
psnr() {
sqlplus -s USR/PASS@PROD << 'EOS' | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//'
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
select max_number-last_number from postalslip
where state = 'OPEN'
/
exit
/
EOS
}
Se ksh
não suportar a $'...'
sintaxe da string, é fácil substituí-la:
# Original style
sed $'s/^[ \t]*//'
# Alternative style
T=$(printf "\t")
...
sed "s/^[ $T]*//"
Uma solução alternativa rápida e suja é usar o shell para remover espaços em branco indesejados. Deixando sua psnr()
função inalterada, em vez disso:
echo "Today's result is: $PSNR" > $MAILTMP
você escreveria isto:
echo "Today's result is:" $PSNR > $MAILTMP
Responder2
sqlplus <<'EOF' | perl -pe 's/\t//g'
Some queries here
EOF
Este espaço é fornecido na guia. Minhas consultas sqlplus são geradas apenas space
no formato csv, então eu uso isso para remover espaço indesejado
echo 'foo bar ,baz ,foobar ' | perl -pe 's/ +,/,/g ; s/ +$//g'
foo bar,baz,foobar