راهنمای مبتدیان برای BASH - شرایط و متغیرها

معرفی

به بخش سوم "راهنمای مبتدیان برای BASH" خوش آمدید اگر شما دو مقاله قبلی را از دست داده اید، احتمالا می خواهید بدانید که چه چیزی باعث می شود این راهنما به سایر راهنماهای اسکریپتی BASH متفاوت باشد.

این راهنمای توسط یک تازه کار کامل به BASH و به عنوان یک خواننده یاد می گیرید که من یاد می گیرم نوشته شده است. در حالی که من یک تازه کار به BASH است، من از یک پس زمینه توسعه نرم افزار می آید، اگر چه بسیاری از چیزهایی که من نوشته شده است برای پلت فرم ویندوز است.

شما می توانید دو راهنمایی اول را با بازدید از:

اگر شما به اسکریپت BASH جدید هستید، قبل از ادامه دادن به این، ابتدا دو راهنمایی را بخوانید.

در این راهنما، من نحوه استفاده از اظهارات شرطی را برای تست ورودی کاربر و کنترل نحوه عملکرد یک اسکریپت برجسته می کنم.

نصب rsstail

برای پیروی از این راهنمای شما باید یک برنامه خط فرمان به نام rsstail که برای خواندن خوراک RSS استفاده می شود را نصب کنید.

اگر از توزیع مبتنی بر Debian / Ubuntu / Nin استفاده می کنید، زیر را وارد کنید:

sudo apt-get نصب rsstail

برای Fedora / CentOS و غیره موارد زیر را تایپ کنید:

yum install rsstail

برای openSUSE نوع زیر را داشته باشید:

zypper نصب rsstail

بیانیه IF

باز کردن یک ترمینال و ایجاد یک فایل به نام rssget.sh با تایپ کردن موارد زیر:

sudo nano rssget.sh

در ویرایشگر nano، متن زیر را وارد کنید:

#! / bin / bash
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛

فایل را با فشار دادن CTRL و O ذخیره کنید و سپس با فشار دادن CTRL و X را بیرون بیاورید.

اجرای اسکریپت با تایپ کردن موارد زیر:

sh rssget.sh

اسکریپت لیستی از عناوین را از خوراک RSS linux.about.com باز می کند.

این یک اسکریپت بیش از حد مفید نیست زیرا فقط عناوین را از یک خوراک RSS بازیابی می کند، اما صرفه جویی در مصرف آن را به مسیر RSS.ini RSS feed ذخیره می کند.

باز کردن اسکریپت rssget.sh در nano دوباره و ویرایش فایل به شرح زیر است:

#! / bin / bash

اگر [$ 1 = "verbose"]
سپس
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
فی

با تایپ کردن موارد زیر، اسکریپت را دوباره اجرا کنید:

sh rssget.sh verb sh

این بار خوراک RSS با عنوان، لینک و توضیحات باز می گردد.

بیایید کمی جزئیات را تجزیه و تحلیل کنیم:

#! / bin / bash در هر اسکریپتی که نوشتیم ظاهر می شود. خط بعدی اساسا به اولین پارامتر ورودی ارائه شده توسط کاربر می رسد و آن را با کلمه "verbose" مقایسه می کند. اگر پارامتر ورودی و کلمه "verbose" مطابق با خطوط بین آن و fi اجرا شوند.

اسکریپت فوق بدیهی است ناقص است. چه اتفاقی می افتد اگر پارامتر ورودی را ارائه ندهید؟ جواب این است که شما خطا را در خطوط اپراتور غیر منتظره دریافت می کنید.

نکته مهم دیگر این است که اگر کلمه "verbose" را ارائه نکنید، هیچ اتفاقی نمی افتد. در حالت ایدهآل اگر کلمه کلیدی را ارائه ندهید، اسکریپت لیستی از عناوین را بازگرداند.

برای ویرایش فایل rssget.sh دوباره از nano استفاده کنید و کد را به صورت زیر تغییر دهید:

#! / bin / bash

اگر [$ 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 verb sh

لیستی از عناوین، شرح ها و لینک ها ظاهر می شود. اکنون دوباره آن را به صورت زیر اجرا کنید:

sh rssget.sh عناوین

این بار فقط یک لیست از عناوین ظاهر می شود.

قسمت اضافی اسکریپت در خط 4 است و بیانیه دیگری را معرفی می کند. در واقع اسکریپت در حال حاضر می گوید اگر اولین پارامتر کلمه "verbose" باشد، توضیحات، لینک ها و عناوین را برای خوراک RSS دریافت کنید، اما اگر اولین پارامتر دیگر باشد فقط فهرستی از عناوین را دریافت کنید.

اسکریپت کمی بهبود یافته است اما هنوز ناقص است. اگر شما موفق به وارد کردن یک پارامتر شوید، هنوز یک خطا دریافت خواهید کرد. حتی اگر شما یک پارامتر را ارائه دهید، فقط می گویند شما نمی خواهید بدان معنی نیست که عناوین را فقط بخواهید. به عنوان مثال شما ممکن است به درستی به اشتباه اشتباه کرده اید یا ممکن است کبوتر را تایپ کنید که البته بی معنی است.

قبل از اینکه سعی کنیم این مسائل را پاک کنیم، می خواهم به شما یک فرمان دیگر که با بیانیه IF ارسال می شود را نشان دهم.

اسکریپت rssget.sh خود را ویرایش کنید تا به صورت زیر نگاه کنید:

#! / bin / bash

اگر [$ 1 = "همه"]
سپس
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "شرح"]
سپس
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؛
فی

من تصمیم گرفتم از واژه لغوی خلاص شود و آن را با همه جایگزین کند. این قسمت مهم نیست اسکریپت فوق الف را معرفی می کند که یک راه کوتاه برای گفتن ELSE IF است.

حالا اسکریپت به صورت زیر عمل می کند. اگر شما اجرا کنید sh rssget.sh همه پس از آن شما شرح، لینک ها و عناوین دریافت کنید. اگر در عوض شما فقط شرح زیر را اجرا کنید rssget.sh شما فقط عناوین و شرح ها را دریافت خواهید کرد. اگر شما هر کلمه دیگری را ارائه می کنید، فهرستی از عناوین دریافت خواهید کرد.

این یک راه سریع برای رسیدن به لیستی از اظهارات شرطی است. یک روش جایگزین برای استفاده از ELIF این است که از آنچه که به عنوان عبارت های IF توزیع شده شناخته می شود استفاده شود.

مثال زیر نشان می دهد که چطور IF نوشته ها کار می کنند:

#! / bin / bash

اگر [$ 2 = "aboutdotcom"]
سپس
اگر [$ 1 = "همه"]
سپس
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "شرح"]
سپس
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 = "همه"]
سپس
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "شرح"]
سپس
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
چیز دیگری
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فی
فی

در صورت تمایل به تایپ همه ی آن ها اگر دوست دارید یا کپی کنید و آن را در فایل rssget.sh خود قرار دهید.

اسکریپت فوق یک پارامتر 2 را معرفی می کند که به شما اجازه می دهد که "feed about.com" یا "lxer.com" را انتخاب کنید.

برای اجرای آن در موارد زیر تایپ می کنید:

sh rssget.sh همه aboutdotcom است

یا

sh rssget.sh همه lxer

البته می توانید همه را با توصیف یا عناوین جایگزین کنید تا فقط توصیف ها و یا عناوین را ارائه کنید.

اساسا کد بالا در مورد پارامتر دوم در مورد dotcom می گوید و سپس در عبارت else دوم که یکی از اسکریپت های قبلی است، نگاهی می اندازد اگر پارامتر دوم lxer باشد و سپس دوباره به صورت بی درنگ به صورت تصادفی در مورد نمایش عناوین، شرح ها یا همه چیز.

این اسکریپت صرفا به عنوان نمونه ای از یک بیانیه توزیع شده توزیع شده است و موارد زیادی وجود دارد که با آن اسکریپت اشتباه می شود، مقاله دیگری برای توضیح همه آنها می گیرد. مسئله اصلی این است که مقیاس پذیر نیست.

تصور کنید که می خواهید یک RSS دیگر اضافه کنید مانند هر کاربر لینوکس یا لینوکس امروز؟ این اسکریپت بزرگ می شود و اگر تصمیم گرفتید که شما بایستی IF را تغییر دهید، باید آن را در مکان های مختلف تغییر دهید.

در حالی که زمان و مکان برای یک درگاه وجود دارد اگر آنها باید به ندرت استفاده می شود. معمولا یک راه برای بازنویسی کد شما وجود دارد به طوری که شما به هیچ وجه نیازی به آن ندارید. من در این مقاله در مورد آینده خواهم نوشت.

بیایید در حال حاضر در مورد اصلاح مسئله افرادی که وارد پارامترهای دوفایی می شوند نگاهی بیندازیم. به عنوان مثال در اسکریپت بالا اگر کاربر وارد چیزی غیر از "aboutdotcom" به عنوان پارامتر دوم باشد، پس از آن یک لیست از مقالات از خوراک RSS از LXER بدون در نظر گرفتن اینکه کاربر وارد lxer یا نه باشد، ظاهر می شود.

علاوه بر این اگر کاربر "همه" یا "توضیحات" را به عنوان پارامتر اول وارد ننماید، به طور پیش فرض یک لیست از عناوین است که ممکن است یا نداشته باشد که کاربر در نظر دارد.

به اسکریپت زیر نگاه کنید (یا کپی کنید و آن را در فایل rssget.sh خود قرار دهید.

#! / bin / bash

اگر [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
سپس
اگر [$ 1 = "همه"] || [$ 1 = "شرح"] || [$ 1 = "عنوان"]
سپس
اگر [$ 2 = "aboutdotcom"]
سپس

اگر [$ 1 = "همه"]
سپس
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "شرح"]
سپس
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 = "همه"]
سپس
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "شرح"]
سپس
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
چیز دیگری
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فی
فی
فی
فی

اولین چیزی که باید توجه داشته باشید این است که اسکریپت در حال حاضر نسبتا بزرگ است و شما به سرعت می توانید ببینید که چطور از بیانیه های کنترل شده توجیه می شود.

بیتی که در این اسکریپت مهم است IF statement || بیانیه در بخش بعد در خط 2 و خط 4.

|| می ایستد برای OR. بنابراین خط اگر [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"] بررسی می کند که پارامتر 2 برابر "aboutdotcom" یا "lxer" است. اگر بعد از آن IF صورت نگرفته باشد کامل است، زیرا بیانیه دیگری برای بیرونی ترین IF وجود دارد.

به طور مشابه در خط 4 خط اگر [$ 1 = "همه"] || [$ 1 = "شرح"] || [$ 1 = "title"] بررسی می کند که پارامتر 1 برابر "یا" یا "توضیحات" یا "عنوان" است.

حالا اگر کاربر اجرا شود sh rssget.sh سیب زمینی پنیر هیچ چیزی بازگشت نیست در حالی که قبل از آنها یک لیست از عناوین از LXER دریافت کرده اند.

مخالفت با || است &&. اپراتور && برای AND نامیده می شود.

من قصد دارم این اسکریپت را بیشتر شبیه یک کابوس ببینم، اما همه چک های مهم را برای اطمینان از اینکه کاربر 2 پارامتر را ارائه کرده است، می کند.

#! / bin / bash

اگر [$ # -eq 2]
سپس

اگر [$ 2 = "aboutdotcom"] || [$ 2 = "lxer"]
سپس
اگر [$ 1 = "همه"] || [$ 1 = "شرح"] || [$ 1 = "عنوان"]
سپس
اگر [$ 2 = "aboutdotcom"]
سپس

اگر [$ 1 = "همه"]
سپس
rsstail -d -l -u http://z.about.com/6/o/m/linux_p2.xml؛
elif [$ 1 = "شرح"]
سپس
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 = "همه"]
سپس
rsstail -d -l -u http://lxer.com/module/newswire/headlines.rss
elif [$ 1 = "شرح"]
سپس
rsstail -d -u http://lxer.com/module/newswire/headlines.rss
چیز دیگری
rsstail -u http://z.about.com/6/o/m/linux_p2.xml؛
فی
فی
فی
فی
فی

تنها بیتی که در آن اسکریپت اضافی است، یکی دیگر از بیانیه IF خارجی به شرح زیر است: اگر [$ # -eq 2] . اگر مقالهای را در مورد پارامترهای ورودی بخوانید، می دانید که $ # تعداد شمارنده پارامترهای ورودی را باز می گرداند. eq برابر با برابر است. بنابراین IF بیان می کند که کاربر وارد 2 پارامتر شده و اگر آنها آن را انجام ندادند فقط بدون هیچ کاری کاری را ترک می کنند. (به خصوص دوستانه نیست).

من آگاه هستم که این آموزش بسیار بزرگ است. برای این هفته خیلی بیشتر نیست، اما من میخواهم قبل از اینکه به پایان برسیم، این کار را انجام دهیم.

آخرین فرمان که شما باید در مورد اظهارات شرطی یاد بگیرید، عبارت CASE است.

#! / bin / bash


اگر [$ # -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
فی

بیانیه مورد بهترین راه برای نوشتن IF IFSE است اگر IFSE IFSE IF.

به عنوان مثال این منطق

اگر میوه = موز
سپس این
پس اگر میوه = پرتقال
سپس این
اگرچه میوه = انگور
سپس این
END IF

می تواند بازنویسی شود:

میوه مورد در
موز)
این کار را انجام دهید
؛؛
پرتقال ها)
این کار را انجام دهید
؛؛
انگور)
این کار را انجام دهید
؛؛
esac

اساسا اولین مورد پس از مورد چیزی است که شما قصد مقایسه (میوه). سپس هر آیتم قبل از براکت، چیزی است که شما در مقابل آن قرار می دهید و اگر با خطوط پیشین مطابقت داشته باشد ؛؛ فرار خواهد کرد بیانیه ای در مورد با esac معکوس (که مورد عقب است) پایان می یابد.

در اسکریپت rssget.sh، بیانیه مورد بیرون می زند برخی از این لانه بندی ناخوشایند را حذف می کند، اگرچه آنرا به اندازه کافی بهبود نمی دهد.

برای بهبود اسکریپت نیاز دارم که شما را به متغیرها معرفی کنم.

به کد زیر نگاه کنید:

#! / bin / bash

lxer = "lxer.com/module/newswire/headlines.rss"
aboutdotcom = "z.about.com/6/o/m/linux_p2.xml"
display = ""
url = ""

اگر [$ # -lt 2] || [$ # -gt 2]
سپس
echo "usage: rssget.sh [all | description | title] [aboutdotcom | lxer]"؛
خروج؛
فی

مورد $ 1 در
همه)
display = "-d -l -u"
؛؛
شرح)
display = "- d -u"
؛؛
عنوان)
display = "- 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"
display = ""
url = ""

اسکریپت با استفاده از متغیرها فورا قابل کنترل است. به عنوان مثال هر پارامتر به طور جداگانه پردازش می شود و بنابراین هیچ عبارتی IF توشیبا وجود ندارد.

متغیر صفحه نمایش بسته به اینکه آیا همه انتخاب، توضیحات یا عنوان را انتخاب کردید و متغیر url به مقدار متغیر aboutdotcom یا مقدار متغیر lxer بسته به اینکه آیا شما در مورد aboutdotcom یا lxer انتخاب کردید، تنظیم می شود.

اکنون دستور rsstail تنها باید از مقدار نمایشگر و آدرس برای اجرای درست استفاده کند.

در حالی که متغیرها فقط با دادن یک نام به آنها تعیین می شوند، برای استفاده از آنها باید علامت $ را در مقابل آنها قرار دهید. به عبارت دیگر variable = مقدار متغیر را به یک مقدار تعریف می کند در حالیکه $ متغیر به معنی محتویات متغیر است.

زیر اسکریپت نهایی این آموزش است.

#! / bin / bash

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]"
display = ""
url = ""

اگر [$ # -lt 2] || [$ # -gt 2]
سپس
استفاده echo $؛
خروج؛
فی

مورد $ 1 در
همه)
display = "-d -l -u"
؛؛
شرح)
display = "- d -u"
؛؛
عنوان)
display = "- u"
؛؛
*)
استفاده echo $؛
خروج؛
؛؛
esac

مورد $ 2 در
aboutdotcom)
url = $ aboutdotcom؛
؛؛
lxer)
url = $ lxer؛
؛؛
linuxtoday)
url = $ linuxtoday؛
؛؛
everydaylinuxuser)
url = $ everydaylinuxuser؛
؛؛
*)
استفاده echo $؛
خروج؛
esac

rsstail $ نمایش $ url؛

اسکریپت فوق RSS های بیشتری را معرفی می کند و یک متغیر کاربردی وجود دارد که به کاربر در مورد چگونگی استفاده از اسکریپت در صورتی که دو متغیر را وارد نکنند یا وارد متغیرهای نادرست شوند، وجود دارد.

خلاصه

این مقاله حماسی بوده و ممکن است خیلی زود رفته باشد. در راهنمای بعدی من شما را به گزینه های مقایسه برای عبارت های IF نشان می دهم و هنوز در رابطه با متغیرها بحث زیادی وجود دارد.

همچنین برای ارتقای اسکریپت فوق، می توان بیشتر انجام داد و این در راهنمایی های آینده به عنوان حلقه ها، grep و عبارات منظم مورد بررسی قرار می گیرد.

برای پیدا کردن راهنماهای مفیدی از بوت دوگانه ویندوز و اوبونتو برای راه اندازی یک ماشین مجازی با استفاده از جعبه های گنوم، نحوه ی انجام این کار را دنبال کنید .