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

به عنوان مثال می خواهیم برنامه ای بنویسیم که وجود فایل etc/passwd/ رو چک کنه و اگه این فایل در مسیر گفته شده وجود داشت پیغام مثبت و اگه وجود نداشت پیغام منفی صادر کنه .

من برای نوشتن همچین برنامه به این صورت عمل می کنم :

1. ابتدا در خط 4 یک ls ساده از فایل مورد نظر گرفتم و خروجی برنامه ls ( چه خروجی درست و چه خروجی غلط ) داخل سطل آشغال ( null ) ریختم تا چیزی روی ترمینال من ظاهر نشه

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

اما برای چک کردن شرط از عبارت “$?” = “0” استفاده کردم که میشه کمی در موردش صحبت کرد . ابتدا باید گفت که برنامه های درست درمون خروجی های متناسب با اجراشون چاپ می کنن، یعنی اگه برنامه اررور بده یک خروجی و اگه برنامه درست کار کنه یک خروجی دیگه چاپ می کنن که به صورت معمول این طور هست که اگه برنامه ای درست کار کنه خروجی 0 رو در نظر بگیره و اگه برنامه ای اررور داد خروخی 1 یا … رو چاپ کنه . برای ls هم به همین صورت است، اگه فایل passwd وجود داشته باشه پس برنامه درست اجرا شده و ls خروجی درست رو در نظر می گیره یعنی 0 رو . اما اگه فایل passwd وجود نداشته باشه ls خروجی اررور رو در نظر می گیره یعنی چیزی به غیر 0 رو که در این جا میشه گفت 2 هست .

برای فهمیدن این که ls در خط 4 عدد 0 رو در نظر گرفته یا 2 رو از عبارت ?$ استفاده می کنیم . حالا فکر کنم دیگه معلوم باشه، توی شرطمون داریم می گیم اگه ls درست اجرا شد یعنی فایل وجود داشت خط 6 رو برامون چاپ کد و اگه ls درست کار نکرد و اررور داد ( یعنی فایل وجود نداشت ) خط 8 رو برامون چاپ کن .

توی این آموزش به طور مفصل تر و دقیق تر در مورد خروجی ارور و … صحبت کردم. پیشنهاد می کنم مطالعه کنیدش.

 

اما روش دیگه ای هم برای این کار وجود داره ! روشی که با دو دلیل میشه ترجیحش داد نسبت به روش بالا :

اول ) تعداد خطوط کمتری استفاده میشه

ب ) توی فهمیدن خروجی درست و غلط برنامه های مختلف کمکمون میکنه

حال اجازه بدید همین برنامه رو به شکلی دیگه بنویسیم :

مراحلی که در خط 4 و 5 اسکریپت اول در نظر گرفته شد تنها در خط 4 اسکریپت بالا جا داده شد . و دقیقا همان کار و معنا را برای بررسی وجود یک فایل انجام می دهد .

 

حالا فرض کنید می خواهیم برنامه ای بنویسیم که فقط در صورت وجود نداشتن فایل مورد نظر برای ما یک خروجی چاپ کند . نحوه نوشتن همچین برنامه ای یکم متفاوت میشه با دو اسکریپت قبلی چرا که ما دیگه نیازی به else و اعمال دو شرط نداریم. به اسکریپت زیر توجه کنید :

همان طور که ملاحظه می کنید از ! استفاده کردیم تا شرط خودمون رو به این شکل بیان کنیم : اگر فایل passwd وجود نداشت آنگاه …

 

حتی میشه پا رو فراتر گذاشت و همین روند رو در داخل یک خط پیاده کرد! به مثال زیر توجه کنید :

دستور بالا تنها در یک خط نوشته شده است و دقیقا کاری که در می خوایم رو انجام میده، یعنی اگه فایل passwd موجود بود خروجی Darad و اگه فایل passwd وجود نداشت خروجی Nadarad رو برای ما چاپ کنه .

دستور بالا از 3 قسمت تشکل شده یعنی :

در قسمت اول که شرطمون چک میشه یعنی میاد چک می کنه که فایل passwd در سیستم وجود داره یا نه

در ادامه از && استفاده شده که معنیش اینه اگه دستور قبلیت درست اجرا شد من هم پشت سرت اجرا میشم . پس توقع داریم اگه قسمت اول درست اجرا بشه، یعنی فایل passwd وجود داشته باشه، این قسمت اجرا بشه و خروجی Darad برای ما چاپ بشه

تو قسمت سوم هم از || استفاده شده که به معنای Logical OR هست و معنیش در این جا اینه که یکی از echo ها باید اجرا بشن . اگر echo اول اجرا شد، دیگه echo دوم اجرا نمیشه اما اگه echo اول اجرا نشد، echo دوم اجرا میشه

گفتیم echo اول تنها در صورتی اجرا می شه که دستور قبلش درست اجرا شده باشه پس میشه نتیجه گرفت که در صورتی echo دوم اجرا میشه که دستور اول درست اجرا نشده باشه یعنی فایل passwd وجود نداشته باشه .

نکته : می توان به جای عبارت [ -f /etc/passwd ] از test استفاده کرد . یعنی :

 

نویسنده : ایمان همایونی
ایمیل نویسنده : info@OSLearn.ir
منبع : وب سایت او اس لرن – http://oslearn.ir
از مطالب وب سایت راضی هستید ؟ رضایت خودتون رو با دونیت به ما اعلام کنید. لطفا برای دونیت روی آیکون زیر کلیک کنید.
 حمایت مالی

درباره نویسنده :

ایمان همایونی هستم، از سال 2009 با گنو لینوکس فعالیت خودم رو در زمینه ی کامپیوتر و IT شروع کردم و تا الان موفق به گذروندن دوره هایLPIC 1 / LPIC 2 / VCP5-DCV / MCITP / CCNA / MTCNA شدم . مدتی در زمینه امنیت فعالیت هایی داشتم اما در حال حاضر تمرکز خودم رو بر روی مجازی سازی و لینوکس گذاشته ام .

تمام پست های من - وب سایت من