تدخل العمليات الحسابية في العديد من سكربتات باش Bash Scripts، فقد تحتاج لحساب المساحة المتبقية من القرص الصلب مثلًا، أو حجوم الملفات أو عرض النطاق الترددي للشبكة، أو تواريخ انتهاء صلاحيات كلمات المرور، أو أعداد المضيفين hosts أو غير ذلك.
وسنتعلم في مقالنا الخامس من سلسلة باش للمبتدئين طريقة استخدام معاملات باش bash operators لإجراء العمليات الحسابية داخل السكربت، وسنبدأ بجدول يتضمن المعاملات الحسابية:
المعامل | الوصف |
---|---|
+ | الجمع |
- | الطرح |
* | الضرب |
/ | قسمة الأعداد الصحيحة بدون بواقي عشرية |
% | قسمة المعاملات التي تُرجع باقي عملية القسمة فقط |
** | الأُس مثلًا x أُس y |
تنفيذ الجمع والطرح في باش
لننشئ سكربت باش يدعى مثلًا addition.sh يجمع حجمي ملفين بالبايت Byte ويعطيك النتيجة، سنستعمل في السكربت وسطاء باش وقد شرحنا طريقة طريقة التعامل معها في مقال تمرير الوسطاء إلى سكربت باش، بالإضافة إلى الأمرين cut
و du
.
يُستَخدَم الأمر du
لمعرفة أحجام الملفات، ويمكن استخدام الراية أو الخيار d-
بعد الأمر وهو اختصار لكلمة bytes لجعل المخرجات بالحجم الفعلي للملف بالبايتات فبدون هذا الخيار سيعرض du
الحجم بالوحدة الافتراضية كيلوبايت. يُظهر هذا الأمر في النتيجة كلًا من اسم الملف وحجمه أي أنه يعطي عمودين أو مُخرَجَين، لذا سنحتاج الأمر cut
لاقتطاع جزء النتيجة الذي نريده فقط وهو الحجم. وبالتالي سنستخدم أنبوب إعادة التوجيه |
لتمرير خرج الأمر du
إلى دخل الأمر cut
.
سيكون نص السكربت addition.sh كما يلي:
#!/bin/bash fs1=$(du -b $1 | cut -f1) fs2=$(du -b $2 | cut -f1) echo "File size of $1 is: $fs1" echo "File size of $2 is: $fs2" total=$(($fs1 + $fs2)) echo "Total size is: $total"
يحتاج السكربت السابق وسيطين، وهنا مرر له الملفين etc/passwd/
و etc/group/
، ثم نفذنا السكربت وسنحصل على النتيجة التالية:
kabary@handbook:~/scripts$ ./addition.sh /etc/passwd /etc/group File size of /etc/passwd is: 2795 File size of /etc/group is: 1065 Total size is: 3860
لاحظ السطر التالي الذي يتضمن عملية الجمع باستخدام المعامل +
:
total=$(($fs1 + $fs2))
ينبغي أن تكتب العمليات الحسابية دائمًا بين قوسين هلاليين مزدوجين (())
بالصيغة التالية:
$((arithmetic-expression))
يمكنك استخدام معامل الطرح -
بالطريقة نفسها، فمثلًا المتغير sub
التالي سيحمل القيمة سبعة:
sub=$((10-3))
تنفيذ عمليتي الضرب والقسمة في باش
لننشئ سكربت بسيط اسمه giga2mega.sh
مثلًا يجري عملية التحويل من جيجا بايت GB إلى ميجا بايت MB وفق التالي:
#!/bin/bash GIGA=$1 MEGA=$(($GIGA * 1024)) echo "$GIGA GB is equal to $MEGA MB"
لنُشغل السكربت الآن لنعرف كم تعادل 4 جيجا بايت بالميجا بايت:
kabary@handbook:~/scripts$ ./giga2mega.sh 4 4 GB is equal to 4096 MB
لقد استخدمنا معامل الضرب *
لضرب عدد الجيجا بايت بالعدد 1024 للحصول على مكافئها بالميجا بايت:
MEGA=$(($GIGA * 1024))
يمكنك تعديل السكربت نفسه ليحول الحجم من جيجا بايت إلى كيلو بايت:
KILO=$(($GIGA * 1024 * 1024))
وبالطريقة نفسها حَوِّله إلى بايت.
لنجرب الآن عملية القسمة باستخدام المعامل /
كما يلي ونُخَزِّن النتيجة في المتغير div
الذي سيحمل القيمة خمسة في مثالنا:
div=$((20 / 4))
القسمة المستخدمة هنا هي قسمة الأعداد الصحيحة، وبالتالي ستكون النتيجة عددًا صحيحًا حتمًا، فلو قَسَّمتَ 5 على 2 باستخدام المعامل /
فستحصل على 2 لأن هذه القسمة تهمل البواقي فهي لا تُرجع أعدادًا عشرية.
kabary@handbook:~/scripts$ div=$((5 / 2)) kabary@handbook:~/scripts$ echo $div 2
إذا رغبت بالتعامل مع الأعداد العشرية فستحتاج للأمر bc
، وهذا مثال على طريقة استخدامه مع القسمة الصحيحة:
echo "5/2" | bc -l 2.50000000000000000000
وتبين الصورة أدناه استخدامه مع العمليات الحسابية الأخرى:
استخدام الأس وباقي القسمة
لننشئ سكربت اسمه power.sh
يقبل وسيطين عدديين ليكونا مثلًا a
و b
، ويُظهر نتيجة b
مرفوعًا للأُس b
كما يلي:
#!/bin/bash a=$1 b=$2 result=$((a**b)) echo "$1^$2=$result"
إذًا فقد استخدمنا المعامل **
لحساب نتيجة a
مرفوعًا للأس b
، لنجرب السكربت على أعداد مختلفة كما يلي:
kabary@handbook:~/scripts$ ./power.sh 2 3 2^3=8 kabary@handbook:~/scripts$ ./power.sh 3 2 3^2=9 kabary@handbook:~/scripts$ ./power.sh 5 2 5^2=25 kabary@handbook:~/scripts$ ./power.sh 4 2 4^2=16
سنتعلم الآن استخدام المعامل %
أي باقي القسمة modulo، يرجع هذا المعامل باقي القسمة فقط ويكون عددًا صحيحًا، فالمتغير rem
في المثال التالي سيحمل القيمة 2:
rem=$((17%5))
الباقي هنا هو 2 لأننا نحصل على 17 بمضاعفة العدد 5 ثلاث مرات وإضافة 2 للنتيجة.
إنشاء محول مقاييس لدرجات الحرارة باستخدام باش
لنطبق مثالًا شاملًا يستخدم كل العمليات الحسابية التي تعلمناها في الفقرات السابقة، سنكتب سكربت جديد باسم c2f.sh
يحول درجة الحرارة من درجة مئوية إلى فهرنهايت وفق المعادلة التالية:
F = C x (9/5) + 32
الطريقة المستخدمة هنا هي إحدى الطرق المتبعة لكتابة هذا السكربت، مع العلم أنه توجد طرق أخرى تعطيك النتيجة نفسها، سنعرف بداية المتغيرات فالمتغيرC
يمثل درجة الحرارة المئوية، والمتغيرF
يمثل درجة الحرارة بالفهرنهايت.
#!/bin/bash C=$1 F=$(echo "scale=2; $C * (9/5) + 32" | bc -l) echo "$C degrees Celsius is equal to $F degrees Fahrenheit."
استخدمنا الأمر bc
هنا لأننا نتعامل مع أعداد عشرية، والأمر scale=2
لإظهار خانتين فقط بعد الفاصلة العشرية.
لنجري بعض الآن التحويلات باستخدام السكربت التالي الذي يقرأ درجة الحرارة المدخلة بالدرجة المئوية، وتحويلها إلى الفهرنهايت، ثم عرض النتيجة لكل قيمة مدخلة:
kabary@handbook:~/scripts$ ./c2f.sh 2 2 degrees Celsius is equal to 35.60 degrees Fahrenheit. kabary@handbook:~/scripts$ ./c2f.sh -3 -3 degrees Celsius is equal to 26.60 degrees Fahrenheit. kabary@handbook:~/scripts$ ./c2f.sh 27 27 degrees Celsius is equal to 80.60 degrees Fahrenheit.
الخلاصة
إلى هنا نكون قد انتهينا من مقالنا الذي شرحنا فيه العمليات الحسابية الأساسية في سكربتات باش مع التطبيق العملي، نرجو أن يكون المقال قد قدم الفائدة المرجوة، وندعوك لمطالعة مقالنا التالي حول التعامل مع السلاسل النصية Strings في باش.
ترجمة -وبتصرف- للمقال Using Arithmetic Operators in Bash Scripting.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.