Multiplication dans un script shell lors de l'envoi de courrier à l'aide de mailx

StackOverflow https://stackoverflow.com//questions/12682837

  •  12-12-2019
  •  | 
  •  

Question

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

Chaque fois que j'essaie d'envoyer un e-mail en utilisant mailx avec la syntaxe ci-dessus, j'obtiens toujours une erreur sur la troisième ligne (Mismatch Percentage) on * sign.Y a-t-il quelque chose de mal que je fais dans le processus de multiplication en troisième ligne ?

Mise à jour:-

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

J'ai essayé le code ci-dessus et cela me donne toujours une erreur sur la première ligne car ( unexpected.Avez-vous une idée de la raison pour laquelle cela se produit ?

Était-ce utile?

La solution

Travaille pour moi:

Le problème peut donc venir de plusieurs choses, comme ne pas utiliser réellement bash (ou une version récente de celui-ci), ne pas exécuter ce que vous avez publié ici, saisie incorrecte, problèmes avec le caractère EOL dans votre fichier 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

Autres conseils

L'utilisation de variables prédéfinies pour les parties fractionnaires peut éviter les longues lignes de commande et la confusion.

En fait, faire echo + awk extraire les pièces semble exagéré.En fonction d'autres aspects de votre module, il serait peut-être préférable de les placer dans des variables distinctes pour commencer, plutôt que dans $QUERY_TEN_DAYS3.

Maintenant, supposons que nous soyons coincés avec $QUERY_TEN_DAYS3, et c'est une valeur délimitée par des espaces sous la forme "DIVISOR DIVIDEND ...", une autre façon de le diviser est la suivante :

read -r FOO BAR JUNK <<<"$QUERY_TEN_DAYS3"

On obtient alors :

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

Le positionnement des parenthèses pour faire la division en premier (tronquer avant de multiplier) semble incertain, mais c'est ce que vous aviez ci-dessus.En utilisant des variables, il est beaucoup plus facile de repérer des points comme celui-ci.

En supposant qu'il s'agisse du shell bash, vous pouvez utiliser une expression comme

$((100 * 4))

pour obtenir une évaluation d’une expression arithmétique.Remplacez « 4 » par l'expression plus grande que vous avez fournie.

Veuillez essayer ceci :

$((100 * $(echo $QUERY_TEN_DAYS3 | awk '{print $2}') / $(echo $QUERY_TEN_DAYS3 | awk '{print $1}')))

Il existe également différentes manières d'utiliser expression commande ou laisser commande.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top