Multiplicación en script shell mientras envía correo usando mailx
Pregunta
mailx -s "Report for $DATE_TENDAYS_FORMAT1" -r uname@host.com uname@host.com <<EOF
Total Items Purchased as per EDW: `echo $QUERY_TEN_DAYS3 | awk '{print $1}'`
Total Items Missing or Mismatch : `echo $QUERY_TEN_DAYS3 | awk '{print $2}'`
Mismatch Percentage: `100*((echo $QUERY_TEN_DAYS3 | awk '{print $2}')/(echo $QUERY_TEN_DAYS3 | awk '{print $1}'))`
EOF
Cada vez que intento enviar un correo electrónico usando mailx
con la sintaxis anterior, siempre recibo un error en la tercera línea (Mismatch Percentage) on * sign
.¿Qué cosa incorrecta estoy haciendo en el proceso de multiplicación en la tercera línea?
Actualizar: -
TEST1=`echo $QUERY_TEN_DAYS3 | awk '{print $1}'`
echo $TEST1
TEST2=`echo $QUERY_TEN_DAYS3 | awk '{print $2}'`
echo $TEST2
mailx -s "Report for $DATE_TENDAYS_FORMAT1" -r uname@host.com uname@host.com <<EOF
Comparison using previous day’s data
******************************************
Mismatch Percentage: $((100 * ($TEST2/ $TEST1)))
EOF
He intentado el código anterior y aún así me da error en la primera línea como ( unexpected
.¿Algún pensamiento, ¿por qué está sucediendo?
Solución
funciona para mí:
Por lo tanto, el problema podría ser cualquier número de cosas, como en realidad no usar bash
(o una versión reciente de ella), sin ejecutar lo que ha publicado aquí, entrada incorrecta, problemas con el carácter EOL en su archivo de script.
$ echo $BASH_VERSION
3.00.15(1)-release
$ QUERY_TEN_DAYS3="1 2"
$ TEST1=`echo $QUERY_TEN_DAYS3 | awk '{print $1}'`
$ echo $TEST1
1
$ TEST2=`echo $QUERY_TEN_DAYS3 | awk '{print $2}'`
$ echo $TEST2
2
$ cat <<EOF
> Comparison using previous day’s data
>
> ******************************************
>
> Mismatch Percentage: $((100 * ($TEST2/ $TEST1)))
>
> EOF
Comparison using previous day’s data
******************************************
Mismatch Percentage: 200
Otros consejos
El uso de variables predefinidas para las partes fraccionadas puede evitar líneas de comando largas y confusión.
Infact, hacer echo
+ awk
para extraer las piezas parecen una sobremorde.Dependiendo de otros aspectos de su módulo, podría estar mejor, poniéndolos en variables separadas para comenzar, en lugar de en $QUERY_TEN_DAYS3
.
Ahora, suponiendo que estamos atascados con $QUERY_TEN_DAYS3
, y es un valor delimitado en el espacio blanco en el formulario "DIVISOR DIVIDEND ..."
, otra forma de romperse es así:
read -r FOO BAR JUNK <<<"$QUERY_TEN_DAYS3"
entonces, obtenemos:
mailx -s "Report for $DATE_TENDAYS_FORMAT1" -r uname@host.com uname@host.com <<EOF
Total Items Purchased as per EDW: $FOO
Total Items Missing or Mismatch : $BAR
Mismatch Percentage: $((100 * ($BAR / $FOO)))
EOF
El posicionamiento de los paréntesis para hacer la división primero (truncar antes de multiplicar) parece ser IFFY, pero es lo que tenía arriba.Al usar variables, es mucho más fácil detectar puntos como este.
Suponiendo que esta es la cáscara de bash, puede usar una expresión como
$((100 * 4))
para obtener una evaluación de una expresión aritmética.Reemplace '4' con la expresión más grande que proporcionó.
Por favor, intente esto:
$((100 * $(echo $QUERY_TEN_DAYS3 | awk '{print $2}') / $(echo $QUERY_TEN_DAYS3 | awk '{print $1}')))
También hay formas diferentes de que usan Expr comando o deje comando.