تبلیغات :
آکوستیک ، فوم شانه تخم مرغی، صداگیر ماینر ، یونولیت
دستگاه جوجه کشی حرفه ای
فروش آنلاین لباس کودک
خرید فالوور ایرانی
خرید فالوور اینستاگرام
خرید ممبر تلگرام

[ + افزودن آگهی متنی جدید ]




نمايش نتايج 1 به 3 از 3

نام تاپيک: آموزش اسکریپت نویسی bash در حد متوسط

  1. #1
    اگه نباشه جاش خالی می مونه
    تاريخ عضويت
    Feb 2008
    پست ها
    216

    پيش فرض آموزش اسکریپت نویسی bash در حد متوسط

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

    خوب بهترین راه برا آموزش دنبال کردن خط به خط یه اسکریپت ساده است.اسکریپت زیر در سیستم من برای دانلود شبانه استفاده میشه(اعداد شماره خط رو بیان میکنن و جزء اسکریپت نیستند) :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    خط اول رو بهش میگن شی بنگ shebang
    به مفسر میگه این فایل اسکریپت رو چه نرم افزاری(چه مفسری) باید اجرا کنه چون ما اسکریپت bash مینویسیم باید به صورت زیر باشه :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    2 تا کاراکتر #! و بلافاصله مسیر مفسر bash و در صورت نیاز آرگومانهایی که باید به مفسر فرستاده بشند.شی بنگ رو میشه به صورت دیگری هم نوشت که دیگه وارد جزییات نمیشم.
    تو 2 خط بعدی 2 متغیر تعریف شدند.یه متغیر رشته ای به نام logfile و یه متغیر عددی به نام bash_ver.برای تعریف متغیر عددی bash_ver از دستوری به نام let پیش از نام متغیر استفاده کرده ام.بدون let هم این تعریف درست عمل میکند.پس چرا از let استفاده کرده ام.اگر در محاسبه مقدار عددی هر اشتباهی صورت گیرد متغیر bash_ver با وجود let با صفر مقداردهی میشود.اما اگر let نبود در صورت بروز اشتباه bash_ver تبدیل به یک متغیر رشته ای میشد که باعث بروز اشتباه در دستور خط بعد آن میشد.دستور let جلوی تبدیل متغیر را میگیرد و تضمین میکن bash_ver عدد خواهد بود.ضمنا با وجود let میتوان از برخی عبارات محاسباتی مستقیما استفاده کرد.

    برای تعریف متغیرهای رشته ای(در اینجا logfile) ترجیحا از علامت نقل قول(double quato) یا single quato باید استفاده کرد.
    در انتساب به مغیرها بعد از علامت تساوی نباید خط فاصله باشد.در انتساب عددی bash_ver بلافاصله بعد از علامت تساوی علامت $ را میبینیم.علامت $ یعنی متغیری وجود دارد که میخواهیم به مقدار آن دست پیدا کنیم.این متغیر {BASH_VERSINFO[0]} میباشد.اما این چه متغیری است؟.(علامتهای {} جزو نام متغیر نمیباشند و در بسیاری موارد اختیاری میباشند اما شما همیشه از آکولاد استفاده کنید)
    یا خود ما متغیرها را تعریف و استفاده میکنیم یا متغیرهایی از قبل وجود دارند که ما از مقادیر آنها بهره میبریم.bash آرایه ای به نام BASH_VERSINFO دارد که اطلاعات نسخه آن را ذخیره میکند.عنصر اول آرایه(همان عنصر 0) شماره ورژن اصلی را در خود دارد.یعنی ما با این دستور انتساب شماره ورژن اصلی bash را در متغیر bash_ver قرار میدهیم.
    در پایان خط دستور انتساب عددی داریم
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    خوب علامت < یک ریدایرکتور است.بدین معنی که خروجی و حاصل عبارت سمت چپ خود را به دستور و یا عبارت سمت راست منتقل میکند.کلیه خروجی ایجاد شده دستور انتساب سمت راست ریدایرکتور به device بخصوصی به نام null میریزد.null یعنی هیچی یعنی خروجی مورد نظر را نابود کن.من با قرار دادن این ریدایرکتور به null در انتهای دستور میخواهم در صورت بروز اشتباه هیچ خروجی روی صفحه نمایش دیده نشود.علامت & معنی به خصوصی دارد که بایستی با مقدمات لازمی توضیح دهم.ما ۳ device بخصوص داریم به نامهای stdin یا ورودی استاندارد که با عدد صفر مشخص میشود.stdout یا خروجی استاندارد که با عدد 1 مشخص میشود و stderr یا اشتباه استاندارد که با عدد 2 مشخص میشود.با ریدایرکتورها میتوان این ورودیها و خروجیها را که دستورات تولید میکنند منتقل کرد.
    ورودی استاندارد معمولا صفحه کلید است اما میتواند یک سخت افزار ورودی دیگر یا حتی خروجی یک دستور دیگر یا محتویات فایل باشد.خروجی استاندارد معمولا صفحه نمایش است.مثلا وقتی دستوری تایپ میکنیم نتیجه آن را در صفحه نمایش میبینیم.ممکن است خروجی استاندارد نیز تغییرکند.اشتباه استاندارد نیز معمولا به صفحه نمیش یا log فایلها متصل میشود.
    علامت & چسبیده به ریدایرکتور < یعنی تمام این خروجی ها فرستاده شود.به جای & میتوان از اعداد 1 یا 2 استفاده کرد.2 یعنی خروجی خطا و 1 یعنی خروجی معمولی(استاندارد)

    خوب در خط 4 تا 7 یه دستور شرطی ساده داریم. دستور if یعنی اگر،یک خط فاصله و سپس دستور ] و سپس یک خط فاصله بعد از اون کل عبارتی که باید محاسبه بشه یک فاصله علامت [ سپس بلافاصله علامت ; دستور then به معنی سپس، عباراتی که در صورت درست بودن شرط if اجرا میشند ود در نهایت با دستور fi دستور پایان میپذیرد.عبارتی که در دستور if درستی یا نادرستی اون برسی میشه یک مقایسه عددی هست به صورت زیر :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    متغیر bash_ver که ایجاد کردیم در اینجا با یه علامت $ که اولش اومده جایگزین میشه یه عملگر به صورت lt- بررسی میکنه که مقدار این متغیر کوچکتر از 4 هست یا نه.lt مخفف lesser then به معنی کوچکتر از میباشد.
    اگر مقدار مقدار متغیر bash_ver کوچکتر از 4 باشد دستورات پس از then اجرا میشند.در غیر اینصورت مفسر از روی این دستورات پرش میکنه و به خط 8 میره.به طور خلاصه این دستور if برسی میکنه اگر ورژن bash قدیمیتر از ورژن 4 باشه یک پیغام خطا چاپ کنه و به اجرای اسکریپت خاتمه بده در غیر اینصورت اسکریپت به اجرای معمول خودش ادامه بده.
    دستورات شرطی ابزار تصمیم گیری و تغییر جهت اجرای برنامه هستند و از مهمترین ابزارهای اسکریپت نویسی هستند.در واقع منطق اسکریپت رو مشخص میکنن.

    ادامه دارد ....

  2. این کاربر از Ahmad24 بخاطر این مطلب مفید تشکر کرده است


  3. #2
    اگه نباشه جاش خالی می مونه
    تاريخ عضويت
    Feb 2008
    پست ها
    216

    پيش فرض

    حالا میخوام خطوط 5 و 6 رو که عبارات داخل دستور شرطی if هستند برسی کنم.
    خط 6 به صورت زیره :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    دستور exit باعث خروج فوری از اسکریپت میشه هر جایی که باشه.عددی که به عنوان آرگومان به دستور exit فرستاده شده در واقع متغیر ERRORLEVEL رو تنظیم میکنه.موقع برگشت از یک برنامه یا اسکریپت به محیط والد اون برنامه(در اینجا ترمینال bash) این مقدار نشاندهنده وضعیت اجرای برنامه میباشد.این مقدار میتواند از 0 تا 255 تنظیم شود.بنا به قرارداد مقدار صفر به معنای پایان موفقیت آمیز و بدون مشکل اسکریپت است.و هر عددی جز آن نشاندهنده مشکل یا اروری در اجرای عادی برنامه است.ما در اسکریپتهایی که مینویسیم خیلی اوقات مقدار بازگشتی این متغیر را در یک دستور شرطی برسی میکنیم.در آینده این مورد را مشاهده خواهید کرد.اعداد 1 تا 127 معمولا برای ارورهای مهم و اعداد 128 تا 255 برای ارورهای غیر مهم یا حتی warning ها میتواند مورد استفاده قرار گیرد.
    اگر هیچ عددی جلوی exit نوشته نشود به صورت پیشفرض ERRORLEVEL روی صفر تنظیم میشود.
    حالا دقیقا به خط 5 نگاه کنید که توضیح نسبتا مفصلی دارد :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    دستور echo دستور ساده ایه که برای نشان دادن وضعیت اجرای اسکریپت استفاده میشه.به طور کلی هر دستوری میتونه همراه آپشنهای متنوعی که پشتیبانی میکنه فراخوانی بشه در اینجا دستور echo با آپشن e- و آرگومان اون که یک رشته کاراکتری(داخل کوتیشن) هست استفاده شده.آپشن e- برای اینه که دستور echo بتونه کاراکتر گریز رو تفسیر کنه.کاراکتر گریز(یا توالی گریز) در این خط t\ هست که به معنای کاراکتر Tab میباشد.یعنی echo با مشاهده t\ آنرا با کاراکتر Tab جایگزین میکند.(یعنی به جای t\ کاراکتر Tab را چاپ میکند) به طور کلی از کاراکتر backslash برای ایجاد توالی های گریز استفاده میشه.این توالی های گریز استفاده گسترده ای دارند.به عنوان مثال من تو ترمینال به فارسی تایپ کردم 'سلام'، خروجی اون رو مشاهده کنید :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    bash این کلمه فارسی رو به صورت توالی های گریز مشاهده میکنه و پردازش میکنه.
    به طور کلی از توالی های گریز به 2 علت استفاده میشه :
    1- نمایش(استفاده از) کاراکترهایی که معمولا نمیشه اونها رو تایپ کرد مثل کاراکتر خط جدید(n\)
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    2-نمایش کاراکترهایی که قراردادن آنها در یک رشته در حالت عادی نا ممکنه.مثلا ما یک رشته رو داخل یک جفت علامت کوتیشن نمایش میدهیم.حالا اگر بخوایم از علامت کوتیشن داخل رشته استفاده کنیم باید اون رو با بک اسلش به شکل کاراکتر گریز دربیاریم وگرنه با مشکل مواجه میشیم.یه مثال دیگه اگر بخواهیم یه فایل یا مسیری که دارای کاراکتر فاصله هست رو به عنوان آرگومان به یه دستور بفرستیم یا باید اونو کلا داخل علامت کوتیشن قرار بدیم یا قبل از کاراکتر فاصله از بک اسلش استفاده کنیم تا اونو به توالی گریز تبدیل کنیم.یک مثال خیلی مهم دیگه کاراکتر $ هست که در bash معنی خاصی داره(برای دسترسی به مقدار یک متغیر استفاده میشه) حالا اگر بخوایم خود کاراکتر $ رو در یک رشته نمایش بدیم قبلش کاراکتر بک اسلش قرار میدیم.
    در دستور echo هر وقت از توالی های گریز استفاده میکنیم جهت پردازش اونها باید آپشن e- را بکار ببریم.
    ابتدای رشته درست بعد از علامت کوتیشن عبارت زیر نوشته شده :
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    date یه دستور ساده برای نمایش یا تنظیم تاریخ و زمان در خط فرمانه.شما میتونید فرمی رو که میخواید زمان نمایش داده بشه با یه رشته FORMAT خاص خودتون به همین صورت بالا جلوی date وارد کنید.علامت + و داخل یک جفت کوتیشن فرمت مورد نظرتون.
    کد:
    برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
    برای بدست آوردن اطلاعات راجع به یه دستور میتونید نام اون دستور رو به دستور man بدید و اطلاعات راهنمای اون دستور رو دریافت کنید.مثلا برای دستور date تو ترمینال تایپ کنید : man date

    متوجه شدید که خروجی دستور date یه رشته کاراکتریه که تاریخ وزمان رو به فرمتی که میخوایم نمایش میده.حالا اون ۲ تا کاراکتر `` در اطراف دستور مال چیه؟ ما میخوایم یه رشته رو چاپ کنیم و هیچ چیزی جز کاراکترهای رشته ای نمیتونه به دستور echo ارسال بشه.وجود کاراکترهای `` اطراف دستور date سبب میشه bash قبل از اونکه آرگومان رشته ای رو به دستور echo بفرسته اون رو پردازش کنه و پس از اجرای دستور date در پس زمینه خروجی اون رو جایگزین دستور date کنه.اگر ‍`` اطراف دستور date نبود به جای نوشتن خروجی دستور date در خروجی خود عبارت دستور به عنوان رشته چاپ میشد.

    پس از کوتیشن پایان دهنده رشته دستور echo پایان میپذیرد(قبل از کاراکتر | ).این علامت | به عنوان pipe یا لوله شناخته میشود.لوله خروجی یک دستور را به عنوان آرگومان به دستور پس از خود میفرستد.فقط توجه داشته باشی که لوله را با ریدایرکتور که قبلا با آن آشنا شدید اشتباه نکنید.ریدایرکتورها خروجی یک سمت را به device یا فایل یا FIFO سمت دیگر میفرستند.در حالیکه لوله فرمان بعد از خود را با خروجی قبل از خود به عنوان آرگومان اجرا میکند.به تدریج معنی این کلمات رو متوجه خواهید شد.

    دستور tee همزمان رشته مورد نظر را روی 2 خروجی استاندارد نمایش میدهد.در اینجا دستور tee خروجی را همزمان که روی صفحه نمایش نشان میدهد در یک فایل log که ما قبلا مسیر آنرا به عنوان متغیر تعریف کرده ایم اضافه میکند.به نحوه استفاده از متغیر logfile که در ابتدای اسکریپت تعریف کرده ایم توجه کنید.دستور tee در اینجا یک آپشن a- دارد که به معنی append یا الحاق میباشد.این آپشن به دستور tee میگوید رشته مورد نظر را به انتهای فایل الحاق کند.اگر آپشن a- نبود فایل با رشته مورد نظر رونویسی میشد و محتویات قبلی آن از بین میرفت.
    مهم نیست که فایل از قبل وجد داشته باشد یا نه.اگر فایل وجود نداشته باشد tee آنرا ایجاد میکند.
    لوله خروجی رشته ای دستور echo را به عنوان آرگومان به دستور tee میفرستد و دستور tee علاوه بر نمایش آن در ترمینال آنرا در فایل logfile مینویسد. معنی آخر این خط نیز مشخص است.<2 به معنی خروجی خطا میباشد.یعنی اگر خطایی در اجرای دستور tee اتفاق افتاد خروجی خطا را دور بریز(نمایش نده)

    البته توجه داشته باشید که دستور tee و بسیاری از دستورات دیگه از لوله پشتیبانی میکنند و اگر دستوری از لوله پشتیبانی نکنه هم میشه از لوله استفاده کرد(با دستور xargs) که در آینده احتمالا به این مورد هم میپردازم.

    ...

  4. این کاربر از Ahmad24 بخاطر این مطلب مفید تشکر کرده است


  5. #3
    حـــــرفـه ای MrGee's Avatar
    تاريخ عضويت
    May 2008
    محل سكونت
    کرج
    پست ها
    3,693

    پيش فرض

    اینجام یه سایت خیلی خوب درمورد آموزش خط فرمان و اسکریپت نویسی تو لینوکسه.
    [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]

Thread Information

Users Browsing this Thread

هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)

User Tag List

قوانين ايجاد تاپيک در انجمن

  • شما نمی توانید تاپیک ایحاد کنید
  • شما نمی توانید پاسخی ارسال کنید
  • شما نمی توانید فایل پیوست کنید
  • شما نمی توانید پاسخ خود را ویرایش کنید
  •