باش: الشروط (if-then-else)

مرحبا

سأوضح لك هذه المرة كيفية عمل نص برمجي بشرط سحقوالتي تترجم هي:

إذا تم إنجاز الشيء X الذي تريده ، فسيتم تنفيذ الإجراء Y ، وإذا لم يتم إنجازه ، فسيتم تنفيذ إجراء آخر.

شرح بسيط لا 😀

الآن ، فكرت لبضع دقائق حول بعض الأمثلة لاستخدامها في هذا البرنامج التعليمي ، حدثت لي المعضلة / المشكلة / الموقف التالي:

نحن على شبكة شركتنا ، ونريد معرفة ما إذا كان كمبيوتر X متصل بالشبكة. لهذا نصنع ملف سيناريو ماذا سيفعل بينغ نحو هذا الكمبيوتر ، وإذا كان على شبكة (أي إذا كان يعيد بينغ) ستخبرنا بنعم ، إنها على الشبكة ، وإلا (أي أنها ليست على الشبكة) ستخبرنا أنها ليست على الشبكة.

بمجرد الانتهاء من ذلك ، سأشرح الآن كيفية الدوران مع الشروط

ها هو الكود:

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

لا تقلق ، سأشرح لك هذا بالتفصيل 😉

بينغ هو الأمر الذي سنستخدمه ، وسيخبرنا ما إذا كان هذا الكمبيوتر الشخصي على الشبكة. لمعرفة أي جهاز كمبيوتر نريد التحقق مما إذا كان موجودًا على الشبكة أم لا ، يجب أن نتغير عنوان IP من الواضح أن عنوان IP لجهاز الكمبيوتر الذي نريد التحقق منه.

كما ترى ، أضع «-c 1«ما هو ضروري لنا. عندما نقوم باختبار اتصال جهاز الكمبيوتر ، لا يتوقف هذا الإجراء (اختبار الاتصال) حتى نضغط على أنفسنا [Ctrl] + [C]، لذلك وضع «-c 1»نطلب منه إجراء تحقق واحد فقط (محاولة ping واحدة فقط) وليس آخر ، وهذا سيجعله يتوقف على الفور ، أي ... سيتحقق مما إذا كان الكمبيوتر على الشبكة مرة واحدة فقط.

إذا كان عندك شك في هذا فلا ألم ... يقولون ذلك وسأشرح لهم مرة أخرى 😉

الآن تأتي الدورة ، لأن ما شرحته للتو ليس أكثر من أمر / إجراء عادي 😀

if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

حتى تفهموا هذا ، سأشرح لكم تفاصيل بالغة الأهمية عن Bash 🙂

يمكن للأشخاص الأكثر دراية بالموضوع أن يصفوني على أنه خطأ أو شيء من هذا القبيل ، لكن مهلا ، أكتب هذا للمبتدئين أو أقل الخبراء ، طالما أنهم يفهمونه جيدًا 😉

يحدث ذلك كما في سحق إنه شيء مثل 0 y 1، أي أنك على قيد الحياة أو ميت ، عند تنفيذ أمر أو إجراء: إما نفذت بشكل جيد ليس هناك أى مشكلة (1)، أو كان هناك بعض مشكلة أو خطأ (0).

نقوم بتنفيذ إجراء أو أمر X ، وقد يكون ما فعلناه قد تم تنفيذه بشكل جيد أو سيئ ، وربما كان هناك خطأ أم لا ، وهنا تكمن التفاصيل 😉

إذا كان ما نرسله للقيام به (في هذه الحالة: ping -c 1 IP-ADDRESS) لم يخطئ وكان ناجحًا ، لذلك سيعيد القيمة: 1 . وإلا ، وإذا لم ينجح الإجراء (أي اختبار ping) ، فسيتم إرجاع القيمة 0.

 وأخيرًا ، ما يعنيه الكود أعلاه هو:

إذا تم إرجاع القيمة 0 ثم

عرض النص: «ليس على الشبكة»

خلاف ذلك (وإرجاع ليس 0 ، ولكن 1)

عرض النص: «إذا كان في الشبكة«

هذا الذي شرحته لك للتو ، سيخدمنا في المستقبل للعديد من الأشياء ، لأنه من المفيد حقًا أن تكون قادرًا على القول أنه إذا تسبب الإجراء X في حدوث خطأ ، فقم بإجراء Y ، وفي حالة عدم ظهور إجراء X خطأ ، دع الإجراء Z.

أعلم أن البعض قد يكون مرتبكًا بعض الشيء ، لذلك حاولت شرحه بعدة طرق مختلفة ، محاولًا جعل الجميع يفهمها بطريقة أو بأخرى. في حال ترك أي شخص موضع شك ، أخبرني بذلك.

الآن ، دعونا نجعل السيناريو الخاص بنا 😀

يجب أن نتبع الخطوات في هذا البرنامج التعليمي: باش: كيفية عمل برنامج نصي قابل للتنفيذ

ثم دعنا ننسخ الكود التالي في هذا الملف (script.sh) ، وفي النهاية دعنا نقول «خروج"(بدون اقتباس):

ping -c 1 DIRECCION-IP
if [ $? -ne 0 ]; then
echo "No está en red"
else
echo "Sí está en red"
fi

يجب أن يبدو هكذا (تذكر أنه يجب عليهم تغيير عنوان IP إلى IP الذي يريدونه):

هنا يمكنك مشاهدة البرنامج النصي قيد التشغيل:

٪ كود 1٪

وكما ترى في النهاية يخبرنا «نعم إنه موجود في الشبكة»🙂

الشيء المهم هنا هو أنهم يفهمون هذا بالفعل عن الشروط ، لذلك أترك لك رمزًا آخر لشرحها مرة أخرى ، ولكن من وجهة نظر أخرى.

read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi

ما يعنيه هذا بسيط ، أترك التفسير سطراً بسطر:

الخط الأول: ما نكتبه ستكون قيمة المتغير «نص"(بدون اقتباس).

الخط الثاني: تحقق مما إذا كان محتوى المتغير (ما كتبناه للتو) هو 3.

الخط الأول: في حالة الوجود 3سيظهر لنا النص «تصحيح"(بدون اقتباس).

الخط الرابع: خلاف ذلك (أي في حال لم نكتب 3).

الخط الرابع: سيظهر لنا النص «غير صحيح"(بدون اقتباس).

الخط الرابع: نهاية الشرط.

كما استطاعوا أن يدركوا ، إذا وضعنا صدى ثم بين الاقتباسات المزدوجة («) نص ، سيؤدي ذلك إلى عرض هذا النص في الجهاز. هذا إذا وضعنا:

echo "esto es una prueba"

سيظهر لنا النص الموجود في المحطة: هذا اختبار

لكن بالعودة إلى هذا المثال الثاني ، سأوضح لك فائدة (وتنفيذ) هذا النص الثاني بشيء بسيط جدًا 😀 ... النموذجي «كم هو 1 + 2؟«

أترك لك رمز النص الكامل:

#!/bin/bash
# -*- ENCODING: UTF-8 -*-
echo "¿Cuánto es 1 + 2?"
read "texto"
if [ "$texto" = "3" ]; then
echo "Correcto"
else
echo "Incorrecto"
fi
exit

إليك كيفية عمل النص:

٪ كود 2٪

حسنًا ... لا يوجد المزيد لإضافته.

هذا شيء أساسي ، بسيط نعم ، لكن ما زلت أحاول شرحه قدر الإمكان ، لأنه لا يمتلك كل شخص روح المبرمج ، وفي كثير من الأحيان نحتاج إلى إنشاء نصوص مثل هذه (أو ما شابه ذلك) ، على أي حال آمل أن تكون هذه المقالة مفيدة لك شخص ما 🙂

أي شك أو سؤال أو شكوى أو اقتراح من فضلك ، اتركه هنا ، وسأجيب عليك بكل سرور ، وبالتالي ، نتعلم جميعًا المزيد 😀

تحياتي


26 تعليقات ، اترك لك

اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها ب *

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   جالس قال

    أنت محترف !!! *أو*

    1.    KZKG ^ جارا قال

      لا لشيء 😀
      لو خدمتك وهي شيقة انا راضي 😉

      تحيات صديق

  2.   لائق قال

    @ KZKG ^ جارا ،
    بالحديث عن برمجة bash لدي سؤال:
    ما الفرق بين التصريح عن متغير مثل VAR = hello هذا والإعلان عن متغير مثل VAR = $ {VAR: -hello}؟

    أشرح:
    http://pastebin.com/a3cfWXeD

    تحياتي 😉

    1.    KZKG ^ جارا قال

      مرحبا
      حسنًا ، أنا لست خبيرًا في bash على الإطلاق ... في الواقع ، ليس لدي فكرة LOL !!
      كما أصرح عن المتغيرات فهي كما يلي:
      : ${OPTFOLDER:="/opt/"}

      لكن لأنني دائمًا ما كنت أفعلها هكذا ، لا أعرف الفرق بصراحة

  3.   لائق قال

    @ KZKG ^ جارا
    حسنًا ، لقد طرحت السؤال لأن الحقيقة هي أنني لم أكن أعرف أيضًا ، فأنا عادة ما أكتب SlackBuilds والحقيقة هي أن المتغيرات المعلنة كما في VAR1 كثيرة في هذه النصوص. ساعدني البحث السريع في google في توضيح هذا السؤال ، وأشاركه مع الجميع حتى نتمكن جميعًا من معرفة:

    النصي:
    http://pastebin.com/faAQb35w

    تفسير:
    إعلان متغيرات النموذج VAR = $ {VAR: -default_value} يعني أن المتغير VAR سيأخذ القيمة default_value فقط إذا كانت القيمة فارغة أو غير موجودة.

    مثال عملي:
    عند تنفيذ البرنامج النصي ، يُطلب إدخال قيمة يتم تخزينها في متغير VAR ، إذا تم إدخال شيء ما ، فسيظهر ما تم إدخاله. إذا لم ندخل أي شيء وضغطنا على إدخال ، فإننا نعلن أن المتغير VAR لاغٍ ، وبالتالي فإنه يظهر value_default.

    تحية.

    1.    KZKG ^ جارا قال

      هاها لم أكن أعرف ذلك 😀
      حسنًا ، شكرًا جزيلاً لك يا صديقي ... هذا ما قصدته بنهاية المقال ، لا أنوي تدريس شيء وهذا كل شيء ، أعلم أنني سأتعلم دائمًا شيئًا جديدًا هنا 😀

      تحياتي وشكرا مرة أخرى.

      1.    لائق قال

        أنت على حق ، يتعلم المرء عدة أشياء هنا.

        تحياتي وعطلات سعيدة !! 😀

  4.   لوكاس ماتياس قال

    رائع وموضح بشكل ممتاز +1 الوقت الذي سيستغرقه ...
    لكنني أستحق الجهد 😉

    1.    KZKG ^ جارا قال

      في الواقع ، لقد كتبت 80٪ في يوم واحد فقط ، وقد استغرق الأمر وقتًا طويلاً لنشرها فقط لأن الإنترنت الخاص بي لم يسمح لي بذلك.
      شكرا لتعليقك 😉

  5.   هوغو قال

    هناك طريقة أخرى للقيام بذلك وهي استخدام DNS ، حيث يتم حظر بروتوكول ICMP في بعض الأحيان:

    (host -ta IP-ADDRESS> / dev / null 2> & 1) && صدى "متصل بالشبكة"

    ستلاحظ أيضًا في هذا المثال أن التحقق من قيمة الإرجاع ضمني 😉

    1.    KZKG ^ جارا قال

      أنت كصديق دائمًا ، مع نصائح لا أعرفها تمامًا HAHAHA.
      شكرًا لك ، التعليق محل تقدير وهاها ... شيء جديد آخر تعلمته 😀

  6.   داتوكس قال

    شكرا

    ؟؟؟؟

  7.   Leper_Ivan قال

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

  8.   إدغار نافارو قال

    دكتور. شكرًا على المساعدة التي أوضحت لي الأمور.

    مجرد استعلام ، كيف أفعل ذلك عندما يتوقف أحد أجهزة الكمبيوتر عن تنفيذ الأمر ping تلقائيًا ، يقوم الآخر بتغيير IP. لدي هذا.

    لتغيير IP
    #! / بن / باش
    ping -c 10 192.168.1.50 # إذا لم يتم تنفيذ الأمر ping تلقائيًا
    ifconfig eth0 192.168.1.50 قناع الشبكة 255.255.255.0 بث 192.168.1.0
    ifconfig eth0 أسفل
    ifconfig eth0 up

  9.   إبراهيم قال

    لأنه عند المقارنة مع إذا كنت تستخدم علامة الاستفهام؟ ما الفرق بين وضع؟ أي حرف آخر

    1.    KZKG ^ جارا قال

      $؟ تعني "المخرجات أو المخرجات السابقة" ، أي في حالة نتيجة الأمر السابق ... 🙂

      1.    أندرو قال

        هناك طريقة أخرى لتحقيق نفس النتيجة ، وهي تمرير الأمر ping مباشرة كوسيطة لما يلي:

        إذا كان ping -c 1 IP-ADDRESS ؛ ثم
        صدى "نعم إنه موجود على الشبكة"
        آخر
        صدى "ليس على الشبكة"
        fi

        ما يحدث هو أنه إذا قيّمت القيمة المعادة للأمر الذي مررته كوسيطة ، وإذا أعاد 0 فهذا صحيح ، وأي شيء آخر يكون خاطئًا. الأقواس المربعة مكافئة لأمر الاختبار. لكن يمكنك تمرير أي أمر كوسيطة (طالما أن الأمر يُرجع بعض القيمة).

  10.   تحياتي قال

    مرحبًا ، كيف يمكنني تنفيذ script.sh مع مستخدم X في البرنامج النصي أقوم بإنشاء مستخدم Y ، ويستمر هذا المستخدم Y في تنفيذ script.sh

    هل يمكن هذا ؟؟

  11.   كوكتوس قال

    ممتع جدا ، شكرا!

  12.   فرانسيسكو قال

    شكرا على المساهمة ، لقد مضى ساعة على فهمها xD ، لكنني فهمتها !!!!.

  13.   إلوي قال

    السيناريو جيد. من الناحية الحسابية ، يمكن أيضًا إجراؤها كـ ($؟ == 0) إذا كانت تساوي الصفر فهي ليست على الشبكة ، وإلا فهي على الشبكة. وإذا كنا لا نزال نرغب في جعلها أكثر تفاعلية ، فيمكننا القول:
    صدى -n أدخل IP:
    قراءة الملكية الفكرية
    ping -c 1 $ ip

  14.   داريو قال

    مرحبًا ، أنا جديد جدًا على هذا ، أحاول إنشاء رقم تذكرة (أبجدي رقمي) من خلال قراءة وأريد أنه إذا كان ما تم إدخاله بالتنسيق الصحيح (ABC-123456) ، فنفذ الأمر "x" ولا أعرف كيف أفعل ذلك ، هل يمكنك مساعدتي؟

    صدى "أدخل التذكرة"
    قراءة -p تذكرة

    إذا كانت تذكرة $ = "ليست هناك فكرة (تنسيق ABC-123456") ؛ ثم cp file.txt $ تذكرة ؛ وإلا صدى "تنسيق خاطئ ، حاول مرة أخرى" ؛ قراءة ع. فاي.

    من المؤكد أنه أمر مروع وهم يضحكون هههه ، لكن كما قلت ، لقد بدأت للتو بهذا.

    إذا شرحت بشكل سيء من فضلك قل لي وأحاول أن أفعل ما هو أفضل.

    عناق الجميع.

  15.   هامبرتو واي قال

    شرح ممتاز وتحياتي

  16.   عجيل قال

    لدي القليل من الشك فيما إذا كان ، وآخرون ، وآخرين.
    أريد برنامج نصي للتحقق من وجود ملف (أحد السجلات) وإذا لم يكن كذلك ، فقم بإنشائه ثم الكتابة إليه لاحقًا. ولكن إذا كان موجودًا ، فأنا أريدك أن تكتب إليه فقط.

    ما لدي هو:

    التاريخ = `التاريخ -R`
    # كنت أقوم باختبار التاريخ المتغير ، والذي لم يتم تحديثه بين بداية ملف
    # عملية وانتهاء ، في بعض الأحيان يمكن أن تمر ساعة والوقت الصحيح لا يخرج.

    إذا [-f /home/user/logs/test.log] ؛
    then
    المس /home/usuario/logs/test.log
    آخر
    صدى "$ date: تم التحديث" >> /home/user/logs/test.log
    صدى «———————————————-» >> /home/user/logs/test.log
    fi

    من الناحية النظرية ، يجب أن يكون الأمر جيدًا ، لكن الحقيقة هي أنه لم يتم تحديثه إذا كان الملف المشار إليه موجودًا بالفعل

    1.    عجيل قال

      آسف ، لقد رأيت أنه لم يتم إرسالها وقد تضاعف