Puedo resolver este problema, pero no entiendo por qué sucede.
Mi tarea es: (en ksh)
- 1er paso: Consultar un número desde una BD con sqlplus,
- 2do paso: Formatear algún texto para un correo,
- 3er paso: envía un correo con estos.
Esta es una parte de mi 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
}
Obtuve un número, 1234567, cuando llamé a esta función.
PSNR=$(psnr)
Escribo una palabra para un correo:
echo "Today's result is: $PSNR" > $MAILTMP
si quiero usar esta variableCORREODebo usar tr -d '\040\011'
lo que encontré aquí, en stackexchange, porque el resultado sin tr será este:
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
Esa pestaña '\t' es la que no entiendo: ¿de dónde viene, de sqlplus? ¿Posiblemente especificidad de DB? (Revisé TOAD, ambas columnas son el número (18). ¿Quizás la función en ksh tenga algunas características especiales?
Respuesta1
También me encontré con este espacio en blanco no deseado cuando trabajaba con una base de datos diferente. Claramente, los scripts de shell y herramientas como SQLPlus no son adecuados para extraer datos de bases de datos, pero hay ocasiones en las que es conveniente.
Mi solución es eliminar los espacios en blanco iniciales y finales del 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
}
Si ksh
no admite la $'...'
sintaxis de cadena, es bastante fácil reemplazarla:
# Original style
sed $'s/^[ \t]*//'
# Alternative style
T=$(printf "\t")
...
sed "s/^[ $T]*//"
Una solución alternativa rápida y sucia es utilizar el shell para eliminar los espacios en blanco no deseados. Dejando tu psnr()
función sin cambios, en lugar de esto:
echo "Today's result is: $PSNR" > $MAILTMP
escribirías esto:
echo "Today's result is:" $PSNR > $MAILTMP
Respuesta2
sqlplus <<'EOF' | perl -pe 's/\t//g'
Some queries here
EOF
Este es el espacio proporcionado en la pestaña. Mis consultas sqlplus salen solo space
y en formato csv, así que lo uso para eliminar espacio no deseado
echo 'foo bar ,baz ,foobar ' | perl -pe 's/ +,/,/g ; s/ +$//g'
foo bar,baz,foobar