A multiplicação em shell script durante o envio de email usando o mailx
Pergunta
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
Sempre que tento enviar um e-mail usando mailx
com a sintaxe acima, eu sempre erro na terceira linha (Mismatch Percentage) on * sign
.Nada de errado, eu estou fazendo a multiplicação processo na terceira linha?
Atualização:-
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
Eu tentei o código acima e ainda dá-me erro na primeira linha como ( unexpected
.Quaisquer pensamentos por que isso está acontecendo?
Solução
Funciona para mim:
Portanto, o problema poderia ser qualquer número de coisas, tais como, na verdade, não usando bash
(ou uma versão recente dele), não executar o que você já postou aqui, a entrada incorreta, problemas com a EOL de caracteres no arquivo 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
Outras dicas
Utilização de variáveis predefinidas para o fracionária pode evitar longas linhas de comando e de confusão.
De fato, fazendo echo
+ awk
para extrair as partes parecem um exagero.Dependendo de outros aspectos do seu módulo, talvez seja melhor colocá-los em variáveis separadas para começar, em vez de em $QUERY_TEN_DAYS3
.
Agora, supondo que está preso com $QUERY_TEN_DAYS3
, e é um espaço em branco delimitado valor, na forma de "DIVISOR DIVIDEND ..."
, outra maneira de dividi-lo é assim:
read -r FOO BAR JUNK <<<"$QUERY_TEN_DAYS3"
Então, temos:
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
O posicionamento dos parênteses para fazer a divisão de primeira (truncar antes de multiplicar), parece duvidoso, mas é o que você tinha anteriormente.Usando variáveis, é muito mais fácil de identificar pontos como esse.
Supondo que este é o shell bash, você pode usar uma expressão como
$((100 * 4))
para obter uma avaliação de uma expressão aritmética.Substitua '4' com a maior expressão que você forneceu.
Por favor, tente este:
$((100 * $(echo $QUERY_TEN_DAYS3 | awk '{print $2}') / $(echo $QUERY_TEN_DAYS3 | awk '{print $1}')))
Existem também maneiras diferentes de usar expr comando ou deixe de comando.