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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top