English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تحكم في العملية في الشل

تحكم في العملية في الشل

مختلف عن لغات البرمجة مثل Java وPHP، لا يمكن أن تكون سيكولوجية شيل فارغة، مثل (ما يلي هو نموذج سيكولوجية PHP):

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // لا تقم بأي شيء
}

في شيل/باش لا يمكنك القيام بذلك، إذا لم يكن هناك أي جملة في فرع else، لا تحتاج إلى كتابة هذا else.

if else

fi

نموذج جملة if:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

كما يلي (للعناصر في سطر الإدخال):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

في نهاية fi هو رد الفعل لـ if، ستجد أشياء مشابهة في المستقبل.

if else

نموذج جملة if else:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

نموذج جملة if else-if else:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

في المثال التالي، يتم�断ان ما إذا كانت قيمتين متساويتين:

a=10
b=20
if [ $a == $b ]
then
   echo 'a يساوي b'
elif [ $a -gt $b ]
then
   echo 'a أكبر من b'
elif [ $a -lt $b ]
then
   echo 'a أقل من b'
else
   echo 'لا يوجد شرط مقبول'
fi

نتائج الإخراج:

a أقل من b

استخدام جملة if else مع الأمر test، مثل ما يلي:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo 'الرقمان متساويان!'
else
    echo 'الرقمان غير متساويان!'
fi

نتائج الإخراج:

الرقمان متساويان!

لفظ for

مثل لغات البرمجة الأخرى، يدعم Shell لفظ for.

نموذج لفظ for عادة ما يكون:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

كما يلي:

for var in item1 item2 ... itemN; do command1; command2… done;

عندما تكون قيمة المتغير في القائمة، يبدأ لفظ for في تنفيذ جميع الأوامر، باستخدام اسم المتغير للحصول على القيمة الحالية في القائمة. يمكن للأمر أن يكون أي أمر أو جملة صالحة للـ shell. يمكن أن تحتوي قائمة in على استبدالات، نصوص واسماء ملفات.

قائمة in إختيارية، إذا لم تستخدمها، يستخدم لفظ الدالة في موقف السطر.

على سبيل المثال، قم بإخراج الأرقام الحالية من القائمة بالترتيب:

for loop in 1 2 3 4 5
do
    echo "القيمة هي: $loop"
done

نتائج الإخراج:

القيمة هي: 1
القيمة هي: 2
القيمة هي: 3
القيمة هي: 4
القيمة هي: 5

إخراج حروف النص بالترتيب:

#!/bin/bash
for str in This is a string
do
    echo $str
done

نتائج الإخراج:

This
is
a
string

جملة while

تستخدم دائرة while لتنفيذ سلسلة من الأوامر باستمرار، وكذلك لقراءة البيانات من ملف الإدخال. تنسيقها هو:

while condition
do
    command
done

هذا هو دائرة while الأساسية، ويكون شرط التحقق: إذا كان int أقل أو يساوي 5، فإن الشرط يعود صحيحًا. يبدأ int من 1، ويُزيد في كل دورة من الدائرة. تشغيل السكربت، يُنتج الأرقام من 1 إلى 5، ثم يُتوقف.

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

تشغيل السكربت، يُنتج:

1
2
3
4
5

استخدم المثال السابق أمر Bash let، والذي يستخدم لتنفيذ جملة واحدة أو أكثر، ليس من الضروري إضافة $ لتمييز المتغيرات، يُرجى الرجوع إلى المعلومات التالية:أمر Bash let

.

دائرة while يمكن استخدامها لقراءة معلومات لوحة المفاتيح. في المثال التالي، يتم تعيين معلومات الإدخال إلى المتغير FILM، ويُنتهي من الدائرة عند ضغط <Ctrl-D>.

echo 'اضغط على <CTRL-D> للخروج'
echo -n 'أدخل اسم الموقع المفضل لديك: '
while read FILM
do
    echo "نعم! $FILM هو موقع جيد"
done

تشغيل السكربت، يُنتج مثل الآتي:

اضغط على <CTRL-D> للخروج
أدخل اسم الموقع المفضل لديك: basis tutorial
نعم! موقع basis tutorial هو موقع جيد

دائرة غير محدودة

تنسيق جملة الدائرة غير محدودة:

while :
do
    command
done

أو

while true
do
    command
done

أو

for (( ; ; ))

دائرة until

تقوم دائرة until بتنفيذ سلسلة من الأوامر حتى يصبح الشرط true، ثم تتوقف.

دائرة until تكون عكس دائرة while في الطريقة التي يتم بها التعامل.

عادة يكون دائرة while أفضل من دائرة until، ولكن في بعض الأحيان - فقط في القليل من الحالات - تكون دائرة until أكثر فائدة.

تنسيق جملة until:

until condition
do
    command
done

condition عادة يكون تعبير شرطي، إذا كان القيمة المعدة false، يستمر تنفيذ جملة الدائرة، وإلا يخرج منها.

في هذا المثال، سنستخدم أمر until لطباعة الأرقام من 0 إلى 9:

#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

نتيجة التنفيذ:

النتيجة الم输出的 تكون:

0
1
2
3
4
5
6
7
8
9

case ... esac

case ... esac إذا كانت جملة اختيار متعددة، فهي مشابهة لـ switch ... case في لغات البرمجة الأخرى، وهي بنية اختيار متعددة الأشعث، تبدأ كل فرع case بـ () اليمنى، وتستخدم ;; لتحقيق break، مما يعني أن التنفيذ انتهى، وأنه تم الخروج من جملة case ... esac كاملة، esac (وهي عكس case) كعلامة انتهاء.

يمكن استخدام جملة case لمطابقة قيمة مع نمط، إذا تم تطابق النمط، يتم تنفيذ الأوامر المترتبة على النمط المطابق.

case ... esac الصيغة هي:

case "القيمة" in
نمط 1)
    command1
    command2
    ...
    commandN
    ;;
نمط 2)
    command1
    command2
    ...
    commandN
    ;;
esac

طريقة عمل case كما هو موضح أعلاه، يجب أن يكون ما بعد القيمة كلمة in، يجب أن تنتهي كل نمط بـ ) اليمنى. يمكن أن تكون القيمة متغيرًا أو عددًا صلبًا، وتبدأ جميع الأوامر بعد اكتشاف أن القيمة تتطابق مع نمط معين حتى ;;.

سيتم فحص القيم التي تطابق كل نمط. إذا تم تطابق النمط، فإنه بعد تنفيذ الأوامر المترتبة على النمط المطابق، لن يتم تنفيذ النماط الأخرى. إذا لم يتم تطابق أي نمط، يتم استخدام نجمة * لالتقاط القيمة، ثم تنفيذ الأوامر التالية.

السكرابت التالي يخبرك بادخال 1 إلى 4، ويطابق كل نمط:

echo 'أدخل رقم من 1 إلى 4:'
echo 'الرقم الذي أدخلتونه هو:'
read aNum
case $aNum in
    1) echo 'اخترت 1'
    ;;
    2) echo 'اخترت 2'
    ;;
    3) echo 'اخترت 3'
    ;;
    4) echo 'اخترت 4'
    ;;
    * ) echo 'لم تدخل رقم من 1 إلى 4'
    ;;
esac

النتيجة ستكون مختلفة بناءً على المحتوى المدخل، مثل:

أدخل رقم من 1 إلى 4:
الرقم الذي أدخلتونه هو:
3
لقد اخترت 3

السكربت التالي يطابق الأنماط النصية:

#!/bin/sh
site="w3codebox"
case "$site" in
   "w3codebox") echo "موقع تعليمي أساسي" 
   ;;
   "google") echo "بحث Google" 
   ;;
   "taobao") echo "موقع Taobao" 
   ;;
esac

النتيجة الم输出的 تكون:

موقع تعليمي أساسي

الخروج من الدورة

في عملية التكرار، في بعض الأحيان قد تحتاج إلى الخروج من الدورة القوية قبل أن تصل إلى شرط إنهاء الدورة، يستخدم Shell أمرين لتحقيق هذه الوظيفة: break و continue.

أمر break

يسمح أمر break بالخروج من جميع الدورانات (يوقف تنفيذ جميع الدورانات التالية).

في هذا المثال، يتحول النص إلى دوران دائم حتى يتم إدخال رقم أكبر من 5. لتنهية هذا الدوران والعودة إلى شاشة التشغيل، يجب استخدام أمر break.

#!/bin/bash
while :
do
    echo -n "أدخل رقم بين 1 و 5:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "الرقم الذي أدخلتة هو $aNum!"
        ;;
        *) echo "الرقم الذي أدخلتة ليس بين 1 و 5! نهاية اللعبة"
            break
        ;;
    esac
done

عندما تنفذ الكود أعلاه، النتيجة ستكون:

أدخل رقم بين 1 و 5:3
الرقم الذي أدخلتة هو 3!
أدخل رقم بين 1 و 5:7
الرقم الذي أدخلتة ليس بين 1 و 5! نهاية اللعبة

continue

أمر continue مشابه لأمر break، ولكن هناك فرق واحد، فهو لا يخرج من جميع الدورانات، بل يخرج فقط من الدورة الحالية.

تعديل المثال السابق:

#!/bin/bash
while :
do
    echo -n "أدخل رقم بين 1 و 5: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "الرقم الذي أدخلتة هو $aNum!"
        ;;
        *) echo "الرقم الذي أدخلتة ليس بين 1 و 5!"
            continue
            echo "نهاية اللعبة"
        ;;
    esac
done

عندما يتم إدخال رقم أكبر من 5، لن ينتهي الدوران في هذا المثال، الجملةecho "نهاية اللعبة"لن تنفذ أبداً.