الضرب في البرنامج النصي Shell أثناء إرسال البريد باستخدام mailx

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

  •  12-12-2019
  •  | 
  •  

سؤال

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

كلما حاولت إرسال بريد إلكتروني باستخدام mailx مع بناء الجملة أعلاه، أحصل دائمًا على خطأ في السطر الثالث (Mismatch Percentage) on * sign.هل هناك أي خطأ أفعله في عملية الضرب في السطر الثالث؟

تحديث:-

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

لقد جربت الكود أعلاه وما زال يعطيني خطأ في السطر الأول ( unexpected.أي أفكار لماذا يحدث ذلك؟

هل كانت مفيدة؟

المحلول

تناسبني:

لذلك يمكن أن تكمن المشكلة في عدد من الأشياء، مثل عدم الاستخدام فعليًا bash (أو نسخة حديثة منه)، عدم تشغيل ما قمت بنشره هنا، إدخال غير صحيح، مشاكل في حرف EOL في ملف البرنامج النصي الخاص بك.

$ 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

نصائح أخرى

يمكن أن يؤدي استخدام المتغيرات المحددة مسبقًا للأجزاء الكسرية إلى تجنب سطور الأوامر الطويلة والارتباك.

في الواقع، القيام echo + awk لاستخراج الأجزاء يبدو مبالغة.اعتمادًا على الجوانب الأخرى لوحدتك، قد يكون من الأفضل وضعها في متغيرات منفصلة للبدء بها، بدلاً من وضعها في متغيرات منفصلة $QUERY_TEN_DAYS3.

الآن، لنفترض أننا عالقون مع $QUERY_TEN_DAYS3, ، وهي قيمة محددة بمسافة بيضاء في النموذج "DIVISOR DIVIDEND ...", ، هناك طريقة أخرى لتقسيمها كما يلي:

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

ثم نحصل على:

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

يبدو وضع الأقواس للقيام بالقسمة أولاً (الاقتطاع قبل الضرب) غير واضح، ولكن هذا هو ما قمت به أعلاه.باستخدام المتغيرات، فإنه من الأسهل بكثير اكتشاف نقاط مثل هذه.

على افتراض أن هذه هي قذيفة باش، يمكنك استخدام تعبير مثل

$((100 * 4))

للحصول على تقييم للتعبير الحسابي.استبدل "4" بالتعبير الأكبر الذي قدمته.

يرجى تجربة هذا:

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

هناك أيضًا طرق مختلفة تستخدم EXPR أمر أو يترك يأمر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top