$ إذا كان صحيحا؛ ثم صدى نعم؛ وإلا صدى لا؛ إذا كان خطأ؛ ثم صدى نعم؛
$ إذا كان صحيحًا && true; ؛ ثم صدى نعم؛ وإلا صدى لا؛
$ إذا كان صحيحًا || خطأ ||.خطأ؛ ثم صدى نعم؛ وإلا صدى لا؛
$ إذا ! خطأ؛ ثم صدى نعم؛ وإلا صدى لا؛ إذا ! صحيح؛ ثم صدى نعم؛
يمكن رؤيته
حقيقيو
خطأ شنيعإننا نمضي قدمًا وفقًا لفهمنا للعمليات المنطقية، ولكن لكي نفهم بشكل أفضل تنفيذ شل للعمليات المنطقية، علينا أن نكتشف،
حقيقيو
خطأ شنيعكيف يعمل؟
الجواب هو: لا.
حقيقيو
خطأ شنيعإنها ليست قيمًا منطقية في حد ذاتها، فهي جميعها أوامر مضمنة في Shell، لكن قيمتها المرجعة هي "قيمة منطقية":
$ true$ صدى $?0$ false$ صدى $?1
يمكن رؤيته
حقيقيعاد 0، و
خطأ شنيعثم يتم إرجاع 1. وهي لا تتوافق مع القيم الحقيقية 1 و0 التي تعلمناها في الرياضيات المنفصلة، بل هي العكس.
$ help true falsetrue: true قم بإرجاع نتيجة ناجحة. false: false قم بإرجاع نتيجة غير ناجحة. $ اكتب true falsetrue عبارة عن غلاف مدمج
يوضح:
$؟وهو متغير خاص يقوم بتخزين الحالة النهائية (رمز حالة الخروج) للعملية الأخيرة.
من خلال العمليات المذكورة أعلاه، ليس من الصعب التفكير في سبب التركيز على برمجة لغة C.
رئيسيأضف أمام الوظيفة
كثافة العمليات، وأضف في النهاية
العودة 0. لأنه في Shell، سيتم استخدام 0 كعلامة على ما إذا كان البرنامج قد انتهى بنجاح
حقيقيو
خطأ شنيعفي جوهرها، يتم استخدامها لتعكس ما إذا كان برنامج معين ينتهي بشكل صحيح، بدلاً من القيم التقليدية الصحيحة والخاطئة (1 و0)، فهي تُرجع 0 و1. ولحسن الحظ، لا داعي للقلق بشأن هذه الأمور عند إجراء العمليات المنطقية.
لقد فهمنا بوضوح من القسم السابق ما هي "القيمة المنطقية" ضمن Shell: إنها القيمة المرجعة عند خروج العملية. إذا عادت بنجاح، فهي صحيحة، وإذا عادت دون جدوى، فهي خاطئة.
ويستخدم الاختبار الشرطي فقط
امتحانيتم استخدام مثل هذه التعليمات لإجراء الاختبارات الرقمية (اختبارات السمات العددية المختلفة)، واختبارات السلسلة (اختبارات سمات السلسلة المختلفة)، واختبارات الملفات (اختبارات سمات الملفات المختلفة)، ونحكم على ما إذا كان الاختبار المقابل ناجحًا، وبالتالي بعد إكمال المهام الروتينية المختلفة ، إلى جانب الجمع المنطقي بين الاختبارات المختلفة، يمكن إكمال المهام الأكثر تعقيدًا.
$ إذا كان الاختبار 5 -eq 5؛ ثم echo YES؛ وإلا echo NO؛ إذا كان الاختبار 5 -ne 5؛ ثم echo YES؛
$ إذا كان الاختبار -n غير فارغ؛ ثم صدى نعم؛ وإلا صدى لا؛ إذا كان الاختبار -z ليس فارغًا؛ ثم صدى نعم؛ إذا كان الاختبار -z؛ ثم صدى نعم؛ إذا كان الاختبار -n؛ ثم صدى نعم، وإلا صدى NO؛
$ if test -f /boot/System.map;
$ a=5;b=4;c=6;$ إذا كان الاختبار $a -eq 5 -a $b -eq 4 -a $c -eq 6;
$ if test -f /etc/profile -o -d /etc/profile;then echo YES; else echo NO;
!لا عملية
$ if test ! -f /etc/profile;
ما سبق يوضح فقط
امتحانقم بإجراء بعض الاختبارات البسيطة جدًا التي يمكنك اجتيازها
اختبار المساعدةيحصل
امتحانالمزيد من استخدامات . تجدر الإشارة إلى ذلك
امتحانهناك بعض الاختلافات بين العمليات المنطقية داخل الأمر والعوامل المنطقية لـ Shell، وتلك المقابلة لها هي:
-أو
&&,
-سو
||، ولا يمكن الخلط بين الاثنين. بدلا من العمليات الجارية
!، قارنها أدناه.
$ cat > test.sh#!/bin/bashecho test[CTRL+D] # اضغط على مجموعة المفاتيح CTRL وD لإنهاء إدخال القطة، كما هو موضح أدناه، ولم يعد يحدد $ chmod +x test.sh$ if test -s test .sh -a -x test.sh; ثم echo YES; else echo NO; if test -s test.sh && test -x test.sh;
$ str1=test$ str2=test$ if test -z $str2 -o $str2 == $str1; ثم صدى نعم؛ وإلا صدى لا؛
$ i=5$ if test ! $i -lt 5 -a $i -eq 6; ؛ آخر صدى لا؛
ومن السهل معرفة الفرق بينهما،
-أو
-سكمعلمة لأمر الاختبار، يتم استخدامه داخل أمر الاختبار، و
&&و
||يتم استخدامه لحساب قيمة الإرجاع للاختبار،
!مشترك لكلاهما. ما يحتاج إلى الاهتمام هو:
في بعض الأحيان ليس من الضروري
!عامل، مثل
-مكافئو
-نيعلى العكس تمامًا، يمكن استخدامه لاختبار ما إذا كانت القيمتان متساويتان؛
-ضو
-نوهو أيضًا مطابق ويستخدم لاختبار ما إذا كانت سلسلة معينة فارغة.
يخرج
سحقداخل،
امتحانيمكن استبدال الأوامر بالعامل []، ولكن تجدر الإشارة إلى أن [
بعد ذلك مع] يجب أن يسبقه مسافات إضافية
عند اختبار سلسلة، يوصى بإحاطة جميع المتغيرات بعلامتي اقتباس مزدوجتين لمنع حدوث موقف حيث توجد معلمات اختبار فقط ولا يوجد محتوى اختبار عندما يكون محتوى المتغير فارغًا.
أدناه نستخدم أمثلة لتوضيح الاحتياطات الثلاثة المذكورة أعلاه:
-نيو
-مكافئوفي المقابل، يمكننا في بعض الأحيان الاستغناء عنها
!عملية
$ i=5$ if test $i -eq 5; else echo NO; if test $i -ne 5; ثم صدى نعم؛ وإلا صدى لا؛
يستخدم
[ ]يمكن أن يحل محل
امتحان، سوف تبدو أكثر "جمالاً"
$ if [ $i -eq 5 ];
تذكر أن تضيف بعض متغيرات السلسلة
،يتذكر[بعد ذلك مع
]أضف مسافة إضافية من قبل
$ str=$ if [ $str = test]; else echo NO; bash: [: =: المشغل الأحادي المتوقع NO $ إذا [ $str = test ]؛
في هذه المرحلة، تم تقديم قائمة الأوامر أدناه ، في الواقع، لقد استخدمناها بالفعل أعلاه، أي مجموعة من أوامر الاختبار المتعددة
&&,
||و
!سلسلة من الأوامر المجمعة. هذا التسلسل من الأوامر يستبدل بشكل فعال
إذا / ثمهيكل فرع مشروط. ليس من الصعب التفكير في أسئلة الاختيار من متعدد التالية التي نقوم بها غالبًا في برمجة لغة C (مثال ممل جدًا، ولكنه ذو معنى): هل سيتم طباعة ما يلي؟
ي، إذا طبع، ما الذي سيتم طباعته؟
#include <stdio.h>int main(){ int i, j=5;j=1; العودة 0؛}
من السهل معرفة أنه سيتم طباعة الرقم 5 لأنه
أنا==5هذا الشرط يحمل، وبعد ذلك
&&، للحكم على ما إذا كان الشرط برمته قد تحقق أم لا، علينا أن نصدر حكما لاحقا، ولكن هذا الحكم ليس حكما تقليديا، بل أولا
يقم بتعديله إلى 5 ثم قم بتحويله إلى قيمة حقيقية، وبالتالي يكون الشرط صحيحًا ويتم طباعة 5. ولذلك يمكن تفسير هذه الجملة على النحو التالي: إذا
أنايساوي 5، ثم ضع
يقم بتعيين قيمة 5 إذا
يأكبر من 1 (لأنه كان صحيحًا من قبل)، ثم اطبعه
يقيمة. استخدمه بهذه الطريقة
&&بيان الحكم المتسلسل يحل محل اثنين
لوبيان فرع مشروط.
إنه يعتمد بدقة على الخصائص الفريدة للعمليات المنطقية التي يمكننا تمريرها
&&,
||ليحل محل
إذا / ثمانتظر بنية الفرع الشرطي، وبالتالي إنشاء قائمة الأوامر.
تتوافق قواعد تنفيذ قائمة الأوامر مع قواعد تشغيل العمليات المنطقية
&&بالنسبة للأوامر المتصلة، إذا عاد الأول بنجاح، فسيتم تنفيذ الأمر التالي، وإلا استخدمه:
||إذا عادت الأوامر المتصلة بنجاح، فلن يتم تنفيذ الأوامر اللاحقة، والعكس صحيح.
$ ping -c 1 www.lzu.edu.cn -W 1 && echo ======= متصل ========
يطرح سؤال مثير للاهتمام للغاية، وهو ما ذكرناه أعلاه: لماذا يجب أن يكون برنامج C
رئيسي()هل ترجع الدالة 0 في النهاية؟ إذا لم يكن الأمر كذلك، فما هي عواقب وضع هذا النوع من البرامج في قائمة الأوامر؟ اكتب برنامج C بسيط بنفسك، ثم ضعه في قائمة الأوامر لترى.
في بعض الأحيان يتم استخدام قائمة الأوامر بدلاً من ذلك
إذا / ثميمكن لبنية الفرع الشرطي حفظ بعض التعليمات البرمجية وجعل البرنامج أكثر جمالا وسهولة في القراءة، على سبيل المثال:
#!/bin/bashecho $#echo $1if [ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null);then echo YESfi
ملاحظة: يتطلب المثال أعلاه أن يكون عدد المعلمات 1 والنوع رقميًا.
زائد
خروج 1، سوف نحذف
إذا / ثمبناء
#!/bin/bashecho $#echo $1! ([ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null)) && خروج 1echo YES
بعد هذه المعالجة، لا يتطلب الحكم على معلمات البرنامج سوى سطر بسيط من التعليمات البرمجية، ويصبح أكثر جمالاً.
يقدم هذا القسم العمليات المنطقية والاختبارات المشروطة وقوائم الأوامر في برمجة Shell.