الضرب في البرنامج النصي Shell أثناء إرسال البريد باستخدام mailx
سؤال
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 أمر أو يترك يأمر.