English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
مختلف عن لغات البرمجة مثل Java وPHP، لا يمكن أن تكون سيكولوجية شيل فارغة، مثل (ما يلي هو نموذج سيكولوجية PHP):
<?php if (isset($_GET["q"])) { search(q); } else { // لا تقم بأي شيء }
في شيل/باش لا يمكنك القيام بذلك، إذا لم يكن هناك أي جملة في فرع else، لا تحتاج إلى كتابة هذا else.
نموذج جملة 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 condition then command1 command2 ... commandN else command fi
نموذج جملة 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
نتائج الإخراج:
الرقمان متساويان!
مثل لغات البرمجة الأخرى، يدعم 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 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 بتنفيذ سلسلة من الأوامر حتى يصبح الشرط 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 إذا كانت جملة اختيار متعددة، فهي مشابهة لـ 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 بالخروج من جميع الدورانات (يوقف تنفيذ جميع الدورانات التالية).
في هذا المثال، يتحول النص إلى دوران دائم حتى يتم إدخال رقم أكبر من 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 مشابه لأمر 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 "نهاية اللعبة"لن تنفذ أبداً.