در شماره گذشته، با یک برنامه نمونه آشنا شدید، فکر می‌کنم حالا وقتش است که نگاهمان عمق بیشتری به مساله پیدا کند و قدرت برنامه‌نویسی پوسته ( Shell) را بیشتر درک کنیم. پوسته یکی از آسان‌ترین زبان‌های برنامه‌نویسی است، یکی از دلایلش این است که شما می‌توانید تکه‌کدهای کوچک خود را پیش از این‌که وارد اسکریپت‌های بزرگ‌تر وارد کنید، به صورت تعاملی (Interactive) اجرا کنید. بنابراین پیش از هر چیز دیگری، به سراغ واحدهای الفبایی یک زبان برنامه‌نویسی، یعنی متغیرها می‌رویم.

متغیرها

در پوسته، پیش از استفاده از متغیرها، آن‌ها را تعریف نمی‌کنیم. بلکه، با استفاده از آن‌ها، در لحظه ایجادشان می‌کنیم (یعنی وقتی که یک مقداری به متغیر پاس می‌دهیم.) به‌طور پیش‌فرض، تمام متغیرها به‌صورت رشته‌ای (String) ذخیره می‌شوند حتی اگر اعدادی را  به آنها بدهیم. پوسته و برخی از نرم‌افزارهای داخلی‌اش رشته‌های عددی را سر موقع عملیات ریاضی، به اعداد تبدیل می‌کنند. لینوکس به کوچکی و بزرگی حروف حساس است، بنابراینAli  باali  فرق دارد و جفتشان باALI  متفاوتند. معمولا در برنامه‌نویسی لینوکس از حروف کوچک برای نام‌گذاری متغیرها استفاده می‌کنند.

در پوسته برای دسترسی به محتویات متغیر نام آن را بعد از علامت $ می‌آوریم.  (یا $ را پیش از نام آن متغیر می‌آوریم. هر کدام را راحت‌ترید به خاطر بسپارید) هروقت محتویات یک متغیر را خواستید، بایستی این $ را قبل از اسمش بیاورید. اگر بخواهید مقداری به متغیر بدهید، فقط نامش را بیاورید، که اگر لازم باشد به‌صورت دینامیک ایجاد خواهد شد. یکی از ساده‌ترین راه‌ها برای نمایش محتویات متغیر، استفاده از echo در ترمینال و بعد آوردن نام متغیر بعد از $ است.

در خط فرمان، می‌توانید این موضوع را در عمل ببینید، این دستورات را در ترمینال وارد کنید:
نکته: توجه داشته باشید که چطور کلمه Yes Dear را که فاصله داشت، داخل نقل قول گذاشتیم. همچنین این نکته را رعایت کنید که دو طرف مساوی نباید فاصله وجود داشته باشد.

با کمک دستور read می‌توانید متغیری را با ورودی از سمت کاربر مقدار دهی کنید. این دستور یک پارامتر می‌گیرد و آن هم نام متغیری است که قرار است مقدار را داخلش بریزد و اجرایش به این صورت است که منتظر ورود متن از سوی کاربر می‌شود. عملیات خواندن وقتی به‌پایان می‌رسد که کاربر دکمه اینتر را بزند. وقتی از ترمینال یک متغیر می‌خوانید، به علامت نقل قول دیگر نیازی نیست. این مثال را ببینید:

نقل قول کردن‌

قبل از این‌که جلوتر برویم، بگذارید تکلیفمان را با یکی از ویژگی‌های پوسته روشن کنیم: استفاده از نقل قول‌ها. معمولا، پارامترهای اسکریپت‌ها با کاراکتر فضای خالی جدا می‌شوند (مثل فاصله، تب یا کاراکتر خط جدید) اگر پارامتری دارید که شامل یک یا چند فضای خالی است، باید این پارامتر را داخل نقل قول بیاورید. عملکرد متغیرها داخل نقل قول، بستگی به نقل قولی دارد که شما استفاده می‌کند. اگر متغیری $ را توی double-quote (نقل قول دوتایی) بیاورید، زمان اجرا با مقدارش جایگزین خواهد شد. اگر متغیر را داخل نقل قول تکی (single-quote) بیاورید، در این صورت هیچ جایگزینی صورت نمی‌گیرد و همان که نوشتید به چاپ می‌رسد. البته، شما می‌توانید به طریقه دیگری معنی خاص $ را از بین ببرید و آن استفاده از  قبل از علامت $ است.

یک مثال کوچک و سریع بزنیم که حسابی اثر نقل قول روی متغیرها دستتان بیاید:

شما می‌دانید که چطور برنامه را اجرا کنید، بنابراین، خروجی به این صورت خواهد بود:

متغیرهای محیطی‌

یادتان است در موردPATH  صحبت کردیم؟ متغیرهای محیطی، که با حروف بزرگ نمایش داده می‌شوند، بسته به تنظیمات شخصی شما ساخته می‌شوند، در راهنمای دستورات خیلی از این متغیرها داریم، اما اصلی‌هایش این‌هاست که در جدول 1 مشاهده می‌کنید.

متغیرهای پارامتری‌

اگر اسکریپت شما با پارامتر صدا زده شود،‌ متغیرهای افزون بر این‌ها ایجاد می‌شوند. اگر هیچ پارامتری پاس داده نشود، متغیر محیطی <-PostContent->zwnj;َ‌ کماکان وجود دارد، اما مقدارش صفر است.

متغیرهای پارامتری در جدول2 فهرست شده‌اند:

بیایید فرق بین *$ و ؛‌$ را با یک مثال سریع بفهمیم:

همانطور که می‌بینید، بدون در نظر گرفتن محتویات نقل قول دوتایی، ‌؛‌$ پارامترها را از هم جدا می‌نویسد. اگر می‌خواهید به پارامترها دسترسی پیدا کنید، به گمانم $ گزینه بهتری است. 

تمرین: ور رفتن با متغیرهای محیطی و پارامترها

پیاده‌سازی بسیار ساده پارامترها را با اسکریپت زیر می‌فهمیم. فقط یادتان نرود که بعد از تایپ و ذخیره آن به اسم  tryvar، حتما آن را با استفاده از  chmod +x tryvar اجرایی کنید وگرنه اجرا نمی‌شود.

اگر این اسکریپت را اجرا کنید، خروجی زیر را می‌گیرید:

شرایط‌

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

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

دستور test  یا ]

در عمل ثابت شده که بیشتر اسکریپت‌ها از علامت ] (براکت باز) یاtest  استفاده می‌کنند. در این سیستم‌ها، ] و test هم معنا هستند، با این تفاوت که وقتی از ] استفاده می‌کنند، آخر دستور یک [ هم می‌گذارند که خوانا باشد. استفاده از علامت براکت [ کمی عجیب به‌نظر می‌رسد، اما توی کد بسیار خوانا و ساده و مشابه زبان‌های برنامه‌نویسی دیگر است.

این دستورات در پوسته‌‌های یونیکس قدیمی‌ برنامه‌های خارجی‌ای اجرا می‌کردند، اما در نسخه‌های جدیدتر دیگر پیاده‌سازی‌شان داخلی شد. این نکته را خوب توجه کنید، به این علت که دستور test معمولا در بیرون از اسکریپت‌های پوسته استفاده نمی‌شود، بسیاری از کاربران تازه‌کار با سیستم، اسم برنامه‌های خودشان را test  می‌گذارند. اگر شما هم جزو این دسته از برنامه‌‌نویس‌ها هستید و این مشکل را دارید، احتمالا برنامه‌تان با دستور test پوسته تداخل دارد. برای این‌که بفهمید کدام برنامه اجرا می‌شود، از دستور  which test استفاده کنید. اما راه‌حل مطمئن، همان استفاده ازtest/.   است که به‌طور قطع و صد در صد برنامه شما را اجرا می‌کند. چقدر خوب است که شما این عادت را در خود به‌وجود بیاورید که برنامه‌ها را با ./ اجرا کنید.

ساختار دستور شرطی test یکی به این صورت است. مثلا برنامه زیر چک می‌کند که فایل موجود است یا خیر:
نکته: توجه داشته باشید که بایستی حتماً بین شرط و علامت‌های [] از کاراکتر فاصله استفاده کنید. و اگر دارید از شیوه test استفاده می‌کنید هم، یادتان باشد که بعد از test همواره و بدون هیچ استثنایی فاصله است!‌ اگر می‌خواهیدthen  را در همان خط شرط بگذارید، بایستی بعد از براکت بسته، از علامت نقطه ویرگول (;) استفاده کنید.

برای اطلاع از توضیح test، از این لینک استفاده کنید:

http://www.ss64.com/bash/test.html

محمدرضا قربانی

منبع :‌کلیک‌

شنبه نهم 6 1387
X