الفرق بين المراجعتين ل"Bash/using case statements"
أسامه-دمراني (نقاش | مساهمات) (إدخال 2.0 إضافة محتوى وتنسيقه والتصنيفات.) |
أسامه-دمراني (نقاش | مساهمات) (إدخال 2.1 تعديل عنوان الصفحة) |
||
سطر 1: | سطر 1: | ||
− | <noinclude>{{DISPLAYTITLE:استخدام | + | <noinclude>{{DISPLAYTITLE:استخدام البُنية case}}</noinclude> |
− | |||
== الحالات المُبسطة == | == الحالات المُبسطة == | ||
قد يكون من السهل اللجوء إلى استخدام عبارات <code>if</code> لبداهة أسلوبها، لكن تلك السهولة تنقلب إلى حيرة حين تواجه بضعة اختيارات مختلفة لإجراءات محتملة يجب اتخاذها، ولمثل تلك الحالات نستخدم عبارة <code>case</code>، وبنيتها اللغوية هي كما يلي:<syntaxhighlight lang="bash"> | قد يكون من السهل اللجوء إلى استخدام عبارات <code>if</code> لبداهة أسلوبها، لكن تلك السهولة تنقلب إلى حيرة حين تواجه بضعة اختيارات مختلفة لإجراءات محتملة يجب اتخاذها، ولمثل تلك الحالات نستخدم عبارة <code>case</code>، وبنيتها اللغوية هي كما يلي:<syntaxhighlight lang="bash"> |
مراجعة 22:29، 29 أغسطس 2018
الحالات المُبسطة
قد يكون من السهل اللجوء إلى استخدام عبارات if
لبداهة أسلوبها، لكن تلك السهولة تنقلب إلى حيرة حين تواجه بضعة اختيارات مختلفة لإجراءات محتملة يجب اتخاذها، ولمثل تلك الحالات نستخدم عبارة case
، وبنيتها اللغوية هي كما يلي:
case EXPRESSION in CASE1) COMMAND-LIST;; CASE2) COMMAND-LIST;; ... CASEN) COMMAND-LIST;; esac
وتطابق كل حالة في التعبير السابق نمطًا (pattern)، وتُنفَّذ الأوامر التي في قائمة COMMAND-LIST
لأول تطابق، ويُستخدم محرف الأنبوب |
لفصل الأنماط المتعددة، وينهي معامِل (
قائمة الأنماط، ويُطلق اسم البند (clause) على كل حالة (case) والأوامر التابعة لها، ويجب أن ينتهي كل بند بفاصلتين منقوطتين ;;
، كما تنتهي أي عبارة case
بعبارة esac
.
انظر المثال التالي الذي يشرح استخدام عبارات case
لإرسال رسائل تحذير أكثر تنوعًا ببرنامج disktest.sh
:
hsoub ~/testdir> cat disktest.sh
#!/bin/bash
# يُجري هذا البرنامج اختبارًا بسيطًا لمساحة القرص الصلب.
space=`df -h | awk '{print $5}' | grep % | grep -v Use | sort -n | tail -1 | cut -d "%" -f1 -`
case $space in
[1-6]*)
Message="All is quiet."
;;
[7-8]*)
Message="Start thinking about cleaning out some stuff. There's a partition that is $space % full."
;;
9[1-8])
Message="Better hurry with that new disk... One partition is $space % full."
;;
99)
Message="I'm drowning here! There's a partition at $space %!"
;;
*)
Message="I seem to be running with an nonexistent amount of disk space..."
;;
esac
echo $Message | mail -s "disk report `date`" hsoub
hsoub ~/testdir>
You have new mail.
hsoub ~/testdir> tail -16 /var/spool/mail/hsoub
From hsoub@alaraby Tue Jan 14 22:10:47 2003
Return-Path: <hsoub@alaraby>
Received: from alaraby (localhost [127.0.0.1])
by alaraby (8.12.5/8.12.5) with ESMTP id h0ELAlBG020414
for <hsoub@alaraby>; Tue, 14 Jan 2003 22:10:47 +0100
Received: (from hsoub@localhost)
by alaraby (8.12.5/8.12.5/Submit) id h0ELAltn020413
for hsoub; Tue, 14 Jan 2003 22:10:47 +0100
Date: Tue, 14 Jan 2003 22:10:47 +0100
From: Hsoub <hsoub@alaraby>
Message-Id: <200301142110.h0ELAltn020413@alaraby>
To: hsoub@alaraby
Subject: disk report Tue Jan 14 22:10:47 CET 2003
Start thinking about cleaning out some stuff. There's a partition that is 87 % full.
hsoub ~/testdir>
كان بإمكانك فتح برنامج البريد الذي تستخدمه لتفقد النتائج، لكن هذا المثال كان لبيان أن البرنامج يرسل رسائل بريدية كاملة شاملة المرسل إليه To
وعنوان الرسالة Subject
والمُرسِل From
. تستطيع إيجاد أمثلة كثيرة لاستخدام عبارات case
في مجلد شيفرات init لديك، إذ تستخدم برامج بدء التشغيل (startup scripts) عبارات start
و stop
لتشغيل أو إيقاف عمليات النظام، ستجد مثالًا نظريًا أدناه.
مثال initscript
تستخدم شيفرات init عبارة case
من أجل بدء وإيقاف خدمات النظام وكذلك من أجل لاستعلام عنها، وفي المثال التالي جزءٌ من برنامج يبدأ خدمة Anacron
، وهو عفريت (daemon) يُنفِّذ أوامرَ بشكل دوري على فترات تُحدد بالأيام.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status anacron
;;
restart)
stop
start
;;
condrestart)
if test "x`pidof anacron`" != x; then
stop
start
fi
;;
*)
echo $"Usage: $0 {start|stop|restart|condrestart|status}"
exit 1
esac
تُحدد المهام التي يجب تنفيذها -مثل تشغيل وإيقاف العفريت- داخل دوال يكون مصدرها، بشكل جزئي، هو ملف etc/rc.d/init.d/functions/
، انظر فصل الدوال في Bash لمزيد من الشرح.