النقاط الرئيسية
استخدم عبارة Linux Bash if لبناء تعبيرات شرطية باستخدام
if
then
fi
البنية. أضف
elif
كلمات رئيسية للتعبيرات الشرطية الإضافية، أو
else
كلمة أساسية لتحديد قسم شامل من الكود يتم تنفيذه إذا لم يتم تنفيذ أي شرط سابق.
تحتاج جميع نصوص Bash غير التافهة إلى اتخاذ قرارات. تتيح عبارة Bash if لنصك النصي Linux طرح الأسئلة، وبناءً على الإجابة، تشغيل أقسام مختلفة من التعليمات البرمجية. وإليك كيفية عملها.
ما هو التنفيذ المشروط؟
في جميع نصوص Bash، باستثناء أبسطها، هناك عادةً حاجة إلى أن يتخذ تدفق التنفيذ مسارًا مختلفًا عبر النص، وفقًا لنتيجة القرار. وهذا ما يسمى بالتنفيذ المشروط.
إحدى الطرق لتحديد فرع التنفيذ الذي يجب اتخاذه هي استخدام if
بيان. قد تسمع
if
عبارات تسمى
if then
عبارات، أو
if then else
عبارات. إنها أسماء مختلفة لنفس الشيء.
ال if
تقول العبارة أنه إذا كان هناك شيء صحيح، فافعل هذا. ولكن إذا كان الشيء خاطئًا، فافعل ذلك بدلاً من ذلك. يمكن أن يكون “الشيء” أشياء عديدة، مثل قيمة متغير، أو وجود ملف، أو ما إذا كانت سلسلتان متطابقتان.
إن التنفيذ المشروط أمر حيوي لأي نص برمجي ذي معنى. فبدونه، ستكون محدودًا للغاية فيما يمكنك تنفيذه من خلال النص البرمجي. وما لم يكن النص البرمجي قادرًا على اتخاذ قرارات ذات معنى، فلن تتمكن من التعامل مع المشكلات الواقعية وإنتاج حلول عملية.
ال if
ربما تكون العبارة هي الوسيلة الأكثر استخدامًا للحصول على التنفيذ الشرطي. إليك كيفية استخدامها في برمجة النصوص في Bash.
مثال على جملة If البسيطة
هذا هو الشكل القانوني لأبسط if
إفادة:
if ( this-condition-is-true )then
execute-these-statements
fi
إذا تم حل الشرط داخل النص إلى true، فسيتم حذف أسطر النص في then
يتم تنفيذ البنود. إذا كنت تبحث في البرامج النصية التي كتبها آخرون، فقد ترى if
بيان مكتوب بهذا الشكل:
if ( this-condition-is-true ); thenexecute-these-statements
fi
بعض النقاط التي يجب ملاحظتها:
- ال
if
يتم اختتام البيان بالكتابةfi
. - يجب أن تكون هناك مسافة بعد القوس الأول
(
“وقبل القوس الثاني”)
“من الاختبار الشرطي.” - إذا كنت ستضع
then
الكلمة الأساسية على نفس السطر مثل الاختبار الشرطي، تأكد من استخدام الفاصلة المنقوطة ”;
” بعد الاختبار.
يمكننا إضافة خيار اختياري else
شرط لتنفيذ بعض التعليمات البرمجية إذا ثبت أن اختبار الشرط خاطئ. else
الجملة لا تحتاج إلى then
كلمة رئيسية.
if ( this-condition-is-true )then
execute-these-statements
else
execute-these-statements-instead
fi
يُظهر هذا البرنامج النصي مثالاً بسيطًا لـ if
عبارة تستخدم else
يفحص الاختبار الشرطي ما إذا كان عمر العميل أكبر من أو يساوي 21 عامًا. إذا كان الأمر كذلك، فيمكن للعميل دخول المبنى، then
يتم تنفيذ البند. إذا لم يكونوا كبارًا بما يكفي، else
تم تنفيذ البند، ولم يُسمح لهم بالدخول.
#!/bin/bashcustomer_age=25
if ( $customer_age -ge 21 )
then
echo "Come on in."
else
echo "You can't come in."
fi
انسخ النص من الأعلى إلى محرر، واحفظه كملف يسمى “if-age.sh”، واستخدم chmod
الأمر الذي سيجعله قابلاً للتنفيذ. ستحتاج إلى القيام بذلك مع كل البرامج النصية التي نناقشها.
chmod +x if-age.sh
دعونا ننفذ البرنامج النصي الخاص بنا.
./if-age.sh
الآن سوف نقوم بتحرير الملف واستخدام عمر أقل من 21.
customer_age=18
قم بإجراء هذا التغيير على البرنامج النصي الخاص بك، ثم احفظ التغييرات. إذا قمنا بتشغيله الآن، فإن الشرط يعود إلى القيمة false، ويتم تنفيذ شرط else.
./if-age.sh
جملة الـ elif
ال elif
تضيف الجملة اختبارات شرطية إضافية. يمكنك الحصول على عدد لا حصر له من الاختبارات الشرطية. elif
الجمل كما تريد. يتم تقييمها بدورها حتى يتم العثور على واحدة منها صحيحة. إذا لم يكن أي من هذه الجمل صحيحًا، elif
ثبت أن الاختبارات الشرطية صحيحة، else
إذا كانت الجملة موجودة، فسيتم تنفيذها.
يطلب هذا البرنامج النصي رقمًا ثم يخبرك إذا كان فرديًا أم زوجيًا. الصفر هو عدد زوجيلذلك لا نحتاج إلى اختبار أي شيء.
يتم اختبار جميع الأرقام الأخرى من خلال إيجاد نموذج من القسمة على اثنين. في حالتنا، يكون modulo هو الجزء الكسري من نتيجة القسمة على اثنين. إذا لم يكن هناك جزء كسري، فإن العدد قابل للقسمة على اثنين، تمامًا. وبالتالي فهو عدد زوجي.
#!/bin/bashecho -n "Enter a number: "
read number
if ( $number -eq 0 )
then
echo "You entered zero. Zero is an even number."
elif ( $(($number % 2)) -eq 0 )
then
echo "You entered $number. It is an even number."
else
echo "You entered $number. It is an odd number."
fi
لتشغيل هذا البرنامج النصي، انسخه إلى محرر واحفظه باسم “if-even.sh”، ثم استخدم chmod لجعله قابلاً للتنفيذ.
دعونا نشغل البرنامج النصي عدة مرات ونتحقق من مخرجاته.
./if-even.sh
كل هذا يعمل بشكل جيد.
أشكال مختلفة من الاختبار الشرطي
الأقواس ” ()
“لقد استخدمنا في اختباراتنا الشرطية طريقة مختصرة لاستدعاء test
البرنامج. وبسبب ذلك، فإن جميع المقارنات والاختبارات التي test
الدعم متاح لك if
إفادة.
هذا هو فقط عدد قليل منهم:
- ! تعبير:صحيح إذا كان التعبير خاطئًا.
- -n سلسلة:صحيح إذا كان طول السلسلة أكبر من الصفر.
- سلسلة -z:صحيح إذا كان طول السلسلة يساوي صفرًا. أي أنها سلسلة فارغة.
- سلسلة 1 = سلسلة 2:صحيح إذا كان string1 هو نفسه string2.
- سلسلة 1 != سلسلة 2:صحيح إذا لم يكن string1 هو نفسه string2.
- عدد صحيح 1 -eq عدد صحيح 2: صحيح إذا كان العدد الصحيح 1 يساوي العدد الصحيح 2 عدديًا
- عدد صحيح 1 -qt عدد صحيح 2: صحيح إذا كان العدد الصحيح 1 أكبر عدديًا من العدد الصحيح 2
- عدد صحيح 1 -lt عدد صحيح 2: صحيح إذا كان العدد الصحيح 1 أقل عدديًا من العدد الصحيح 2
- -d الدليل:صحيح إذا كان الدليل موجودًا.
- ملف -e:صحيح إذا كان الملف موجودًا.
- ملف -s:صحيح إذا كان الملف موجودًا بحجم أكبر من الصفر.
- ملف -r:صحيح إذا كان الملف موجودًا وتم تعيين إذن القراءة.
- ملف -w:صحيح إذا كان الملف موجودًا وتم تعيين إذن الكتابة.
- -ملف x:صحيح إذا كان الملف موجودًا وتم تعيين إذن التنفيذ.
في الجدول، يمكن أن يتضمن “الملف” و”الدليل” مسارات الدليل، سواء كانت نسبية أو مطلقة.
علامة التساوي “=
“واختبار المساواة -eq
ليست متماثلة. تقوم علامة التساوي بإجراء مقارنة نصية حرفًا بحرف. يقوم اختبار المساواة بإجراء مقارنة عددية.
يمكننا أن نرى هذا باستخدام test
برنامج على سطر الأوامر.
test "this string" = "this string"
test "this string" = "that string"
test 1 = 001
test 1 -eq 001
في كل حالة، نستخدم echo
أمر لطباعة رمز الإرجاع للأمر الأخير. صفر يعني صحيح، واحد يعني خطأ.
استخدام علامة المساواة ” =
“يعطينا استجابة خاطئة عند مقارنة 1 بـ 001. هذا صحيح، لأنهما سلسلتان مختلفتان من الأحرف. رقميًا، هما نفس القيمة—واحد—لذا فإن -eq
يعيد المشغل استجابة صحيحة.
إذا كنت تريد استخدام مطابقة الأحرف البدل في الاختبار الشرطي الخاص بك، فاستخدم القوس المزدوج ” (( ))
“النحو.”
#!/bin/bashif (( $USER == *ve ))
then
echo "Hello $USER"
else
echo "$USER does not end in 've'"
fi
يتحقق هذا البرنامج النصي من اسم حساب المستخدم الحالي. إذا كان ينتهي بـ “ve
“، يقوم بطباعة اسم المستخدم. إذا لم ينتهي بـ ” ve
“، كما يخبرك النص، وينتهي.
./if-wild.sh
عبارات If المتداخلة
يمكنك وضع if
بيان داخل آخر if
إفادة.
هذا مقبول تمامًا، ولكن التعشيش if
تجعل العبارات الكود أقل سهولة في القراءة وأكثر صعوبة في الصيانة. إذا وجدت نفسك تتداخل مع أكثر من مستويين أو ثلاثة مستويات من if
إذا كنت تريد معرفة المزيد عن عباراتك، فربما تحتاج إلى إعادة تنظيم منطق البرنامج النصي الخاص بك.
هذا نص برمجي يبين اليوم كرقم من واحد إلى سبعة. الرقم واحد هو يوم الاثنين، والرقم سبعة هو يوم الأحد.
يخبرنا بساعات عمل المتجر. إذا كان يوم عمل أو يوم سبت، فإنه يخبرنا أن المتجر مفتوح. إذا كان يوم الأحد، فإنه يخبرنا أن المتجر مغلق.
إذا كان المتجر مفتوحًا، فإن المتداخلة if
يقوم البيان بإجراء اختبار ثانٍ. إذا كان اليوم هو الأربعاء، فإنه يخبرنا أنه مفتوح في الصباح فقط.
#!/bin/bash# get the day as a number 1..7
day=$(date +"%u")
if ( $day -le 6 )
then
## the shop is open
if ( $day -eq 3 )
then
# Wednesday is half-day
echo "On Wednesdays we open in the morning only."
else
# regular week days and Saturday
echo "We're open all day."
fi
else
# not open on Sundays
echo "It's Sunday, we're closed."
fi
انسخ هذا البرنامج النصي إلى محرر، واحفظه كملف يسمى “if-shop.sh”، واجعله قابلاً للتنفيذ باستخدام chmod
يأمر.
لقد قمنا بتشغيل البرنامج النصي مرة واحدة ثم قمنا بتغيير ساعة الكمبيوتر لتصبح يوم الأربعاء، ثم قمنا بتشغيل البرنامج النصي مرة أخرى. ثم قمنا بتغيير اليوم إلى يوم الأحد وقمنا بتشغيله مرة أخرى.
./if-shop.sh
./if-shop.sh
./if-shop.sh
الحالة إذا
التنفيذ المشروط هو ما يجلب القوة للبرمجة والكتابة النصية، والتواضع if
قد تكون العبارة هي الطريقة الأكثر استخدامًا لتبديل مسار التنفيذ داخل الكود. لكن هذا لا يعني أنها الإجابة دائمًا.
كتابة كود جيد يعني معرفة الخيارات المتاحة لديك وأفضل الخيارات التي يمكنك استخدامها لحل متطلب معين. if
إن البيان رائع، ولكن لا تجعله الأداة الوحيدة في حقيبتك. على وجه الخصوص، تحقق من case
عبارة يمكن أن تكون بمثابة حل في بعض السيناريوهات.