دليل المبتدئين إلى BASH - الشروط والمتغيرات

المقدمة

مرحبًا بكم في الجزء الثالث من "دليل المبتدئين إلى BASH". إذا كنت قد غاب عن المادتين السابقتين ، فربما تريد معرفة ما الذي يجعل هذا الدليل مختلفًا عن أدلة البرمجة النصية الأخرى في BASH.

تتم كتابة هذا الدليل من قبل مبتدئ كامل إلى BASH ، وكذلك كقارئ تتعلمه وأنا أتعلم. بينما أنا مبتدئ إلى BASH أتيت من خلفية تطوير البرامج على الرغم من أن معظم الأشياء التي قمت بكتابتها كانت لمنصة Windows.

يمكنك الاطلاع على أول دليلين عن طريق زيارة:

إذا كنت جديدًا في برمجة Bash ، فأوصيك بقراءة أول دليلين قبل المتابعة مع هذا البرنامج.

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

تثبيت rsstail

من أجل اتباع هذا الدليل ، ستحتاج إلى تثبيت تطبيق سطر الأوامر يسمى rsstail والذي يُستخدم لقراءة مواجز RSS .

إذا كنت تستخدم نوع توزيع قائم على Debian / Ubuntu / Mint ، فقم بما يلي:

sudo apt-get install rsstail

بالنسبة إلى فيدورا / CentOS ، اكتب ما يلي:

yum تثبيت rsstail

ل openSUSE اكتب ما يلي:

zypper تثبيت rsstail

بيان IF

افتح الطرفية وقم بإنشاء ملف يسمى rssget.sh بكتابة ما يلي:

sudo nano rssget.sh

ضمن محرر nano أدخل النص التالي:

#! / بن / سحق
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛

احفظ الملف بضغط CTRL و O ثم قم بالخروج بضغط CTRL و X.

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

sh rssget.sh

سيقوم البرنامج النصي بإرجاع قائمة العناوين من موجز ويب linux.about.com.

لا يعد هذا البرنامج نصيًا مفيدًا للغاية لأنه يسترد فقط العناوين من موجز ويب RSS واحد ولكنه يوفر الحاجة إلى تذكر المسار إلى موجز ويب RSS الخاص بـ Linux.about.com.

افتح البرنامج النصي rssget.sh في nano مرة أخرى وقم بتحرير الملف ليبدو كالتالي:

#! / بن / سحق

إذا كان [$ 1 = "verbose"]
ثم
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي

قم بتشغيل البرنامج النصي مرة أخرى بكتابة ما يلي:

sh rssget.sh مطول

هذه المرة تأتي تغذية RSS مع العنوان والارتباط والوصف.

دعنا نحلل النص البرمجي في جزء من التفاصيل:

يظهر #! / bin / bash في كل نص نكتبه. يبحث السطر التالي أساسًا عن أول معامل إدخال يقدمه المستخدم ويقارنه بكلمة "verbose". إذا كانت معلمة الإدخال وكلمة "verbose" تتطابق مع السطور الموجودة بين ثم يتم تشغيل fi .

السيناريو أعلاه من الواضح أن معيبة. ماذا يحدث إذا لم تقدم معلمة إدخال على الإطلاق؟ الجواب هو أن تحصل على خطأ على غرار المشغل غير المتوقع.

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

استخدم nano مرة أخرى لتحرير الملف rssget.sh وتعديل الشفرة على النحو التالي:

#! / بن / سحق

إذا كان [$ 1 = "verbose"]
ثم
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي

احفظ الملف وشغله بكتابة ما يلي:

sh rssget.sh مطول

ستظهر قائمة بالعناوين والأوصاف والروابط. الآن قم بتشغيله مرة أخرى كما يلي:

sh rssget.sh العناوين

هذه المرة فقط تظهر قائمة العناوين.

الجزء الإضافي من البرنامج النصي موجود على السطر 4 ويقدم بيانًا آخر . في الأساس ، يقول النص الآن إذا كانت المعلمة الأولى هي الكلمة "verbose" ، فاحصل على وصف ، وروابط وعناوين لخلاصات RSS ولكن إذا كانت المعلمة الأولى هي أي شيء آخر ، فكل ما عليك هو الحصول على قائمة بالعناوين.

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

قبل أن نحاول مسح هذه المشكلات ، أريد أن أظهر لك أمرًا آخرًا يتناسب مع عبارة IF.

قم بتحرير البرنامج النصي rssget.sh الخاص بك ليبدو كالتالي:

#! / بن / سحق

إذا كان [$ 1 = "all"]
ثم
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "description"]
ثم
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml؛

آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي

قررت التخلص من الكلمة المطولة واستبدالها بكل شيء. هذا ليس الجزء المهم. يقدم البرنامج النصي أعلاه elif وهي طريقة قصيرة لقول ELSE IF.

الآن يعمل البرنامج النصي على النحو التالي. إذا قمت بتشغيل sh rssget.sh ، فستحصل على الأوصاف والروابط والعناوين. إذا كنت بدلا من ذلك فقط تشغيل وصف sh rssget.sh سوف تحصل فقط على العناوين والأوصاف. إذا قمت بتوفير أي كلمة أخرى ستحصل على قائمة من العناوين.

هذا يقدم وسيلة للخروج بسرعة مع قائمة من البيانات الشرطية. طريقة بديلة للقيام ELIF هي استخدام ما يعرف ببيانات IF المتداخلة.

فيما يلي مثال يوضح كيفية عمل عبارات IF المتداخلة:

#! / بن / سحق

إذا كان [$ 2 = "aboutdotcom"]
ثم
إذا كان [$ 1 = "all"]
ثم
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "description"]
ثم
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml؛

آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي
آخر
إذا كان [$ 1 = "all"]
ثم
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "description"]
ثم
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي
فاي

لا تتردد في كتابة كل ذلك إذا أردت أو نسخها ولصقها في ملف rssget.sh الخاص بك.

يقدم البرنامج النصي أعلاه معلمة ثانية تسمح لك باختيار "about.com" أو "lxer.com" على موجز RSS.

لتشغيله ، اكتب ما يلي:

sh rssget.sh كل aboutdotcom

أو

sh rssget.sh جميع lxer

يمكنك بالطبع استبدال جميع الأوصاف أو العناوين لتوفير أوصاف فقط أو مجرد عناوين.

في الأساس ، يشير الكود أعلاه إلى ما إذا كانت المعلمة الثانية هي aboutdotcom ، ثم أنظر إلى العبارة الثانية إذا كانت هي نفسها من النص السابق ، إذا كانت المعلمة الثانية هي lxer ثم أنظر إلى العبارة if الداخلية مرة أخرى لتحديد ما إذا كنت تريد إظهار العناوين والأوصاف أو كل شيء.

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

تخيل أنك تريد إضافة موجز RSS آخر مثل Everyday Linux User أو Linux Today؟ سيصبح البرنامج النصي ضخمًا وإذا قررت أنك تريد تغيير عبارة IF الداخلية ، فسيتعين عليك تغييرها في أماكن متعددة.

في حين أن هناك وقت ومكان ل IF متداخلة ينبغي استخدامها لماما. عادة ما تكون هناك طريقة لإعادة بناء رمزك بحيث لا تحتاج إلى IF المتداخلة على الإطلاق. سوف أذهب إلى هذا الموضوع في مقال في المستقبل.

دعونا ننظر الآن في حل مشكلة الأشخاص الذين يدخلون معلمات داف. على سبيل المثال ، في البرنامج النصي أعلاه إذا أدخل المستخدم شيئًا آخر غير "aboutdotcom" كمعامل ثانٍ ، تظهر قائمة المقالات من خلاصة RSS من LXER بغض النظر عما إذا كان المستخدم يدخل lxer أم لا.

بالإضافة إلى ذلك ، إذا لم يقم المستخدم بإدخال "الكل" أو "الوصف" كمعلمة أولية ، فسيكون الإعداد الافتراضي هو قائمة العناوين التي قد تكون مقصودة للمستخدم.

انظر إلى النص التالي (أو انسخه والصقه في ملف rssget.sh الخاص بك.

#! / بن / سحق

إذا كان [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
ثم
إذا كان [$ 1 = "all"] || [$ 1 = "description"] || [$ 1 = "title"]
ثم
إذا كان [$ 2 = "aboutdotcom"]
ثم

إذا كان [$ 1 = "all"]
ثم
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "description"]
ثم
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml؛

آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي
آخر
إذا كان [$ 1 = "all"]
ثم
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "description"]
ثم
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي
فاي
فاي
فاي

أول شيء يجب أن تلاحظه هو أن البرنامج النصي أصبح الآن كبيرًا إلى حد كبير ويمكنك أن ترى بسرعة كيف يمكن أن تصبح عبارات IF المتداخلة خارج السيطرة.

الشيء المهم في هذا البرنامج النصي هو عبارة IF || قسم THEN على السطر 2 والخط 4.

ذا لتقف على OR. إذاً الخط إذا [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] يتحقق مما إذا كانت المعلمة الثانية تساوي "aboutdotcom" أو "lxer". إذا لم يكن الأمر كذلك ، فستكون جملة IF مكتملة نظرًا لعدم وجود أي عبارة أخرى لمعظم IF الخارجية .

وبالمثل على السطر 4 ، إذا كان الخط [$ 1 = "all"] || [$ 1 = "description"] || يقوم [$ 1 = "title"] بالتحقق مما إذا كانت المعلمة الأولى تساوي إما "all" أو "description" أو "title".

الآن إذا كان المستخدم يدير sh rssget.sh البطاطس الجبن يتم إرجاع أي شيء في حين أنها قبل أن تلقي قائمة من العناوين من LXER.

عكس || هو &&. يشير عامل التشغيل && إلى AND.

سأجعل النص يبدو أكثر شبهاً بالكابوس ، لكنه يجعل كل الشيكات المهمة للتأكد من أن المستخدم قد قدم معلمتين.

#! / بن / سحق

إذا كان [$ # -eq 2]
ثم

إذا كان [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
ثم
إذا كان [$ 1 = "all"] || [$ 1 = "description"] || [$ 1 = "title"]
ثم
إذا كان [$ 2 = "aboutdotcom"]
ثم

إذا كان [$ 1 = "all"]
ثم
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "description"]
ثم
rsstail -d -u http://z.about.com/6/o/m/linux_p2.xml؛

آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي
آخر
إذا كان [$ 1 = "all"]
ثم
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "description"]
ثم
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
آخر
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فاي
فاي
فاي
فاي
فاي

الجزء الوحيد الإضافي في هذا البرنامج النصي هو عبارة IF خارجية أخرى كما يلي: if [$ # -eq 2] . إذا قرأت المقالة حول معلمات الإدخال ، ستعرف أن $ # يعرض عددًا من معلمات الإدخال. و -eq لتقف على قدم المساواة. ومن ثم ، فإن عبارة IF تتحقق من أن المستخدم أدخل معلمتين وإذا لم يخرجا من القائمة فقط دون القيام بأي شيء. (غير ودية بشكل خاص).

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

الأمر الأخير الذي تحتاج إلى معرفته حول عبارات الشرطية هو عبارة CASE.

#! / بن / سحق


إذا كان [$ # -eq 2]
ثم
حالة 2 دولار في
aboutdotcom)
حالة $ 1 في
الكل)
rsstail -d -l -u z.about.com/6/o/m/linux_p2.xml
؛؛
وصف)
rsstail -d -u z.about.com/6/o/m/linux_p2.xml
؛؛
عنوان)
rsstail -u z.about.com/6/o/m/linux.about.com/6/o/m/linux_p2.xml
؛؛
ESAC
؛؛
lxer)
حالة $ 1 في
الكل)
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
؛؛
وصف)
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
؛؛
عنوان)
rsstail -u http://lxer.com/module/newswire/headlines.rss
؛؛
ESAC
؛؛
ESAC
فاي

بيان الحالة هو طريقة أجمل للكتابة إذا كان EL ELSE IF ELSE IF ELSE IF.

على سبيل المثال هذا المنطق

إذا الفاكهة = الموز
ثم هذا
آخر إذا الفاكهة = البرتقال
ثم هذا
آخر إذا الفاكهة = العنب
ثم هذا
إنهاء إذا

يمكن إعادة كتابتها على النحو التالي:

حالة الفاكهة في
موز)
افعل هذا
؛؛
البرتقال)
افعل هذا
؛؛
العنب)
افعل هذا
؛؛
ESAC

أساسا البند الأول بعد القضية هو الشيء الذي ستقارنه (أي الفاكهة). ثم كل عنصر قبل الأقواس هو الشيء الذي تقارنه ، وإذا كان يتطابق مع الخطوط السابقة ؛ سيتم ركض. يتم إنهاء بيان الحالة مع esac عكسي (وهو حالة backward).

في النص البرمجي rssget.sh يزيل بيان الحالة بعض ذلك التعشيش الشنيع على الرغم من أنه لا يحسّنه بشكل كاف.

لتحسين البرنامج النصي بالفعل ، أحتاج إلى تعريفك بالمتغيرات.

انظر الى الكود التالي:

#! / بن / سحق

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
عرض = ""
URL = ""

إذا كان [$ # -lt 2] || [$ # -gt 2]
ثم
echo "usage: rssget.sh [all | description | title] [aboutdotcom | lxer]"؛
ىخرج؛
فاي

حالة $ 1 في
الكل)
display = "- d -l -u"
؛؛
وصف)
display = "- d -u"
؛؛
عنوان)
عرض = "- ش"
؛؛
ESAC

حالة 2 دولار في
aboutdotcom)
URL = $ aboutdotcom.
؛؛
lxer)
URL = $ lxer.
؛؛
ESAC
عرض $ rsstail $ url؛

يتم تعريف متغير بإعطائه اسما ثم تخصيص قيمة له. في المثال أعلاه ، فيما يلي تعيينات المتغيرات:

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
عرض = ""
URL = ""

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

يتم الآن ضبط متغير العرض بناءً على ما إذا اخترت الكل أو الوصف أو العنوان وتم تعيين متغير url على قيمة المتغير aboutdotcom أو قيمة متغير lxer حسب ما إذا كنت قد اخترت aboutdotcom أو lxer.

الآن يجب أن يستخدم الأمر rsstail قيمة العرض وعنوان url للتشغيل بشكل صحيح.

في حين يتم تعيين المتغيرات فقط من خلال منحهم اسما واستخدامها فعليك أن تضع علامة $ أمامهم. بمعنى آخر متغير = قيم مجموعات متغير إلى قيمة بينما المتغير $ يعني إعطائي محتويات المتغير.

ما يلي هو البرنامج النصي النهائي لهذا البرنامج التعليمي.

#! / بن / سحق

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
everydaylinuxuser = "http://feeds.feedburner.com/everydaylinuxuser/WLlg"
linuxtoday = "http://feedproxy.google.com/linuxtoday/linux"
الاستخدام = "الاستخدام: rssget.sh [الكل | الوصف | العنوان] [lxer | aboutdotcom | everydaylinuxuser | linuxtoday]"
عرض = ""
URL = ""

إذا كان [$ # -lt 2] || [$ # -gt 2]
ثم
صدى استخدام دولار.
ىخرج؛
فاي

حالة $ 1 في
الكل)
display = "- d -l -u"
؛؛
وصف)
display = "- d -u"
؛؛
عنوان)
عرض = "- ش"
؛؛
*)
صدى استخدام دولار.
ىخرج؛
؛؛
ESAC

حالة 2 دولار في
aboutdotcom)
URL = $ aboutdotcom.
؛؛
lxer)
URL = $ lxer.
؛؛
linuxtoday)
URL = $ linuxtoday.
؛؛
everydaylinuxuser)
URL = $ everydaylinuxuser.
؛؛
*)
صدى استخدام دولار.
ىخرج؛
ESAC

عرض $ rsstail $ url؛

يقدم البرنامج النصي أعلاه المزيد من موجزات RSS وهناك متغير استخدام يخبر المستخدم بكيفية استخدام البرنامج النصي إذا لم يقوموا بإدخال متغيرين أو قاموا بإدخال خيارات غير صحيحة للمتغيرات.

ملخص

لقد كانت هذه مقالة ملحمية وربما تكون قد ذهبت بعيدا جدا في وقت قريب جدا. في الدليل التالي سوف أريكم جميع خيارات المقارنة لبيانات IF ، ولا يزال هناك الكثير للتحدث عنه فيما يتعلق بالمتغيرات.

هناك أيضًا المزيد مما يمكن فعله لتحسين النص أعلاه ، وسيتم تغطيته في الأدلة المستقبلية بينما نستكشف الحلقات و grep والتعبيرات العادية.

تحقق من كيفية (قم بالمرور أسفل الفئات لرؤية قائمة المقالات) قسم من l inux.about.com للعثور على أدلة مفيدة أكثر من نظام التشغيل المزدوج Windows و Ubuntu لإعداد جهاز ظاهري باستخدام مربعات GNOME .