النقاط الرئيسية
- يدعم غلاف Linux Bash فقط العمليات الحسابية الصحيحة ولا يمكنه إجراء حسابات على الأعداد العشرية.
- تتيح لك أداة bc في Linux إجراء حسابات دقيقة للفاصلة العائمة بشكل تفاعلي وفي نصوص shell.
- باستخدام bc، يمكنك تعيين عدد الأماكن العشرية التي سيتم عرضها وإجراء العمليات الحسابية بدقة تعسفية، بما في ذلك استخدام الوظائف من مكتبة الرياضيات القياسية.
يدعم غلاف Linux Bash العمليات الحسابية الصحيحة فقط. ولا يمكنه فهم أو التعامل مع حسابات الفاصلة العائمة. توفر لك أداة bc حسابات الفاصلة العائمة الدقيقة بشكل تفاعلي وفي نصوص غلاف.
لماذا يدعم Bash الأعداد الصحيحة فقط
قرار التصميم الأصلي لتقييد يونكسصدفة بورن إلى حساب صحيح قد إن هذا القرار قد يكون متجذراً في عملية ربط عدد صحيح ببايت واحد من ذاكرة الوصول العشوائي في بداية الحوسبة. وقد لا نعرف أبداً السبب الحقيقي وراء هذا القرار. ولا نعرف أيضاً لماذا اختارت نسخة لينكس من غلاف بورن، غلاف باش، أن تحذو حذوه.
لا يمكن لـ Bash بمفرده إجراء حسابات على أرقام ذات فاصلة عائمة، كما يتم الإبلاغ عن الحسابات على الأعداد الصحيحة التي قد يكون لها جزء كسري في الإجابة، كقيم عددية صحيحة مقطوعة. وهذا صحيح على سطر الأوامر وفي نصوص Bash shell. اعتمادًا على حالة الاستخدام الخاصة بك، قد يكون هذا مشكلة أو مربكًا.
يأتي Linux مع تطبيقين مساعدين يسمحان لك بإجراء حسابات الفاصلة العائمة. أحدهما هو dc. إنه غريب بعض الشيء، حيث يعمل كما هو الحال في تدوين البولندي العكسيالأداة الأخرى هي bc. ويمكن استخدامها بشكل تفاعلي أو كأمر، وهي الحل الذي سنناقشه هنا.
المشكلة
دعونا نجعل Bash يقسم ستة على ثلاثة.
echo $((6 / 3))
نحصل على الإجابة المتوقعة وهي اثنان. الآن دعنا نقسم ستة على سبعة. من الواضح أن الإجابة ستكون كسرية.
echo $((6 / 7))
من الواضح أن الصفر خاطئ. دعنا نحاول مرة أخرى، بقسمة 16 على 7.
echo $((16 / 7))
نحصل على إجابة 2. ما يحدث هو أن الجزء الكسري من الإجابة يتم تجاهله، لذا يتم اقتطاع الإجابة. لم يكن هناك جزء كسري في المثال الأول، لذا نحصل على الإجابة الصحيحة.
لم يكن في المثال الثاني عنصر عدد صحيح في الإجابة، بل كان هناك جزء كسري فقط. ولأن الجزء الكسري تم تجاهله، فإن الإجابة التي نراها هي صفر.
في المثال الثالث، يتم تقسيم 7 إلى 16 مرتين، مع وجود باقي كسري. مرة أخرى، يتم تجاهل الباقي، ويتم اقتطاع النتيجة.
استخدام bc بشكل تفاعلي
بإمكانك استخدام bc كآلة حاسبة تفاعلية عن طريق كتابة bc والضغط على مفتاح “Enter”.
bc
يبدأ تطبيق bc في التشغيل، ويعلن عن رقم الإصدار الخاص به، ثم ينتظر إدخالك. يؤدي كتابة عملية حسابية والضغط على “Enter” إلى قيام bc بتقييم العملية الحسابية وعرض الإجابة.
16 * 41024 / 32
2^2 * 1024
يمكنك استخدام “Ctrl+L” لمسح الشاشة، و”Ctrl+D” للخروج من البرنامج. دعنا نحاول إجراء عملية حسابية تحتوي على مكون كسري في الإجابة.
22 / 7
هذا ليس ما توقعناه. على عكس المتوقع، على الرغم من أن bc يسمح لنا باستخدام الدقة التعسفية، إلا أنه افتراضيًا لن يعرض النقطة العشرية أو أي أرقام تليها.
لكي نجعل الإجابة الصحيحة مرئية، نحتاج إلى إخبار bc بعدد الخانات العشرية التي يجب عرضها. نفعل ذلك باستخدام أمر “scale”. سنطلب سبعة خانات عشرية، ونعيد إجراء حساباتنا.
scale=7
22 / 7
أخيرًا، وصلنا إلى مكان ما. يظل إعداد “المقياس” في مكانه حتى تقوم بتغييره. إن ضبط عدد الأماكن العشرية يخبرنا بأن الحد الأقصى عدد الأماكن المراد عرضها. إذا لم تكن الإجابة تحتاج إلى هذا العدد من الأماكن العشرية، فسيتم عرضها بعدد الأماكن العشرية المطلوبة وليس أكثر. ولا يتم حشوها بأصفار لا معنى لها.
scale=10
0.300003 * 0.5
يمكنك إدراج حسابات مختلفة على نفس السطر باستخدام الفاصلة المنقوطة “;” لفصلها. يتم عرض الإجابات على السطر كالمعتاد، بالترتيب الذي تم إدراج الحسابات به.
25 * 6; 12.5 + 45.001; 3 + 5 + 7 + 9
يمكنك أيضًا تضمين الأمر “scale” في القائمة.
scale=8; 22 / 7; scale=3; 0.3 * 0.071
المكتبة القياسية للرياضيات
يؤدي الخيار -l (مكتبة الرياضيات القياسية) إلى قيام bc بتحميل مجموعة من الوظائف، وتعيين “المقياس” إلى 20 مكانًا عشريًا.
bc -l
22 / 7
بعد تحميل المكتبة القياسية، يمكنك استخدام هذه الوظائف في حساباتك.
- س(س):جيب x
- ج(س):جيب تمام x.
- أ(x):ظل الزاوية لـ x
- ل(س):اللوغاريتم الطبيعي لـ x
- السابق):أسّ e للقيمة x
- ج(ن،س):دالة بيسل من رتبة عدد صحيح n من x.
تستخدم الجيب وجيب التمام والظل العكسي قيم الراديان.
s (1.1)
c (.891207)
a (.628473)
إرسال الإدخال إلى bc على سطر الأوامر
يمكنك استخدام إعادة التوجيه والأنابيب لإرسال المدخلات إلى bc. يقوم بمعالجة المدخلات الخاصة بك ويعرض الإجابة في نافذة المحطة الطرفية.
يمكنك إعادة التوجيه إلى bc مع أو بدون خيار -l (مكتبة الرياضيات القياسية).
bc <<< 22/7
bc -l <<< 22/7
لتوجيه الإدخال إلى bc، يجب أن يكون الإدخال عبارة عن إخراج لعملية أخرى. من الملائم استخدام echo لهذا الغرض.
echo 22/7 | bc
echo 22/7 | bc -l
إذا كان لديك مسافات في إدخالك، أو كنت تريد تضمين أمر “scale”، فقم بوضع إدخالك بين علامتي اقتباس.
echo "22 / 7" | bc -l
echo "scale=6; 22 / 7" | bc
استخدام bc في نصوص Bash Shell
لدينا الآن كل ما نحتاجه لنتمكن من إجراء حسابات الفاصلة العائمة في نصوص bash الخاصة بنا، بالدقة التي نختارها. يمكننا أيضًا الرجوع إلى متغيرات Bash في حساباتنا، بما في ذلك المعلمات الخاصة بالنص.
إليك نص المثال الخاص بنا. انسخ هذا النص إلى محرر، واحفظه باسم “pi.sh”، ثم أغلق محرر النصوص الخاص بك.
#!/bin/bashfirst_number=22
second_number=7
pi=$(echo "scale=$1; $first_number/$second_number" | bc)
echo "Pi to $1 decimal places is: $pi"
نستخدم متغيرين، “first_number” و”second_number” لحفظ قيمتين عدديتين. نستخدم هذين المتغيرين في المدخلات التي ننقلها إلى bc.
لقد استخدمنا أيضًا معلمة سطر الأوامر الأولى التي تم تمريرها إلى البرنامج النصي، “$1″، كقيمة لتعيين “المقياس” إليها.
قبل أن نتمكن من تجربة البرنامج النصي الخاص بنا، نحتاج إلى جعله قابلاً للتنفيذ باستخدام chmod.
chmod +x pi.sh
دعنا نحاول استخدام البرنامج النصي الخاص بنا مع قيم سطر أوامر مختلفة.
./pi.sh 5
./pi.sh 14
./pi.sh 20
نحصل على عرض pi لعدد الأماكن التي نحددها على سطر الأوامر في البرنامج النصي الخاص بنا.
كل هذا يضيف
إن تجاوز حدود الرياضيات الصحيحة فقط في Bash يمنح نصوصنا الدقة والوضوح.
يعد استخدام echo لتوجيه الإدخال إلى bc داخل البرامج النصية أمرًا صعبًا بعض الشيء، ولكنه يعمل بشكل جيد للغاية، والفوائد تستحق ذلك.